blob: f1a8f56e5900238ee8a301d47083f410c462b909 [file] [log] [blame]
hong.liud2417072025-06-27 07:10:37 -07001#include <stdbool.h>
b.liu68a94c92025-05-24 12:53:41 +08002#include <dlfcn.h>
3#include <time.h>
4#include <pthread.h>
hong.liud2417072025-06-27 07:10:37 -07005#include "gsw_nw_interface.h"
cz.lif4a9a932025-06-05 11:37:59 +08006#define SIG_TIMER 5
q.huang66b79162025-06-27 17:45:34 +08007#define MODEM_TIMER 5
8
b.liu68a94c92025-05-24 12:53:41 +08009//mbtk include
10#define LYNQ_AIR_PLANE_MODE_OFF 1 //at+cfun = 1
11#define LYNQ_AIR_PLANE_MODE_ON 4 // at+cfun = 4
12#define LYNQ_AIR_CFUN_MODE_OFF 0 // at+cfun = 0
13
14#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
15
16#define FPLMN_STRING_LENGTH 120
17#define ENTRY_LENGTH 6
18#define FPLMN_ARRAY_SIZE (FPLMN_STRING_LENGTH / 6) + 1
19
q.huang238b22a2025-06-10 14:36:59 +080020#define MBTK_ERR_OK 0
xf.li56b78fb2025-06-13 03:29:21 -070021#define GSW_IMEI_LENGTH 15+1
q.huang238b22a2025-06-10 14:36:59 +080022
q.huangfa0a0a32025-06-12 17:07:23 +080023#define INT_32_MAX (0x7FFFFFFF)
24
q.huang238b22a2025-06-10 14:36:59 +080025
b.liu68a94c92025-05-24 12:53:41 +080026#ifndef FALSE
27#define FALSE (0)
28#endif
29
30
31#ifndef TRUE
32#define TRUE (!FALSE)
33#endif
34
35typedef unsigned int uint32;
36typedef unsigned char uint8;
q.huang861c07d2025-06-24 16:54:58 +080037typedef signed char int8;
b.liu68a94c92025-05-24 12:53:41 +080038typedef unsigned short uint16;
39typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
40
q.huangdaa16d42025-07-03 14:32:48 +080041//#define MBTK_READY_UCI "persist.mbtk.sdk.state"
42#define SDK_READY_CMD "uci get persist.mbtk.sdk__state"
q.huang66b79162025-06-27 17:45:34 +080043#define MBTK_READY_STRING_SIZE_MAX (3+1)
44
45
46typedef enum{
47 MBTK_READY_INIT = -1,
48 MBTK_READY_SUCCESS,
49 MBTK_READY_MODEM_FAIL,
50 MBTK_READY_RESPONSE_FAIL,
51 MBTK_READY_SOCKET_FAIL,
52 MBTK_READY_RIL_FAIL
53}mbtk_ready_status_type;
54
b.liu68a94c92025-05-24 12:53:41 +080055typedef enum
56{
57 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
58 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
59 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
60 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
61 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
62 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
63}MBTK_DEV_MODEM_FUNCTION;
64
65typedef enum
66{
67 MBTK_CELL_TYPE_GSM = 0,
68 MBTK_CELL_TYPE_UMTS,
69 MBTK_CELL_TYPE_LTE
70} mbtk_cell_type_enum;
71
72typedef struct
73{
74 MBTK_DEV_MODEM_FUNCTION fun;
75 int rst;
76} mbtk_modem_info_t;
77
78typedef struct
79{
80 int client_fd;
81 pthread_t read_thread_id;
82 int exit_fd[2];
83 bool is_waitting;
84 pthread_cond_t cond;
85 pthread_mutex_t mutex;
86
87 pthread_mutex_t send_mutex;
88
89 // Temp response data.
90 uint16 info_err;
91 uint16 data_len;
92 void *data;
93
94 //mbtk wyq for server_ready_status add start
95 char server_ready_status;
96 //mbtk wyq for server_ready_status add end
97
98 mbtk_info_callback_func net_state_cb;
99 mbtk_info_callback_func call_state_cb;
100 mbtk_info_callback_func sms_state_cb;
101 mbtk_info_callback_func radio_state_cb;
102 mbtk_info_callback_func sim_state_cb;
103 mbtk_info_callback_func pdp_state_cb;
104 //add signal by xr
105 mbtk_info_callback_func signal_state_cb;
106} mbtk_info_handle_t;
107
108
109
110typedef struct
111{
q.huang638d5872025-06-21 13:44:43 +0800112 // NR server cell:
113 // NR cell:
b.liu68a94c92025-05-24 12:53:41 +0800114 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
115 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
116 // WCDMA server cell: lac, ci, arfcn
117 // WCDMA cell: lac, ci, arfcn
118 // GSM server cell: lac, ci, arfcn, bsic
119 // GSM cell:
q.huang638d5872025-06-21 13:44:43 +0800120 uint32 value1; //tac
121 uint32 value2; //pci
122 uint32 value3; //dlEuarfcn
123 uint32 value4; //bler
124 uint32 value5; //band
125 uint32 value6; //mcc
126 uint32 value7; //mnc
127 uint32 value8; //rsrp
128 uint32 value9; //rsrq
129 uint32 value10; //cell identiy
130 uint32 value11; //sinr
131 uint32 value12; //is tdd
132 uint32 value13;
133 uint32 value14;
134 uint32 value15;
b.liu68a94c92025-05-24 12:53:41 +0800135} __attribute__((packed)) mbtk_cell_info_t;
136
b.liu68a94c92025-05-24 12:53:41 +0800137typedef struct
138{
139 uint8 net_pref; // mbtk_net_pref_enum
140 uint16 gsm_band; // mbtk_gsm_band_enum
141 uint16 umts_band; // mbtk_umts_band_enum
142 uint32 tdlte_band; // mbtk_tdlte_band_enum
143 uint32 fddlte_band; // mbtk_fddlte_band_enum
144 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
145} __attribute__((packed)) mbtk_band_info_t;
146
147typedef struct list_arraynode
148{
149 void *data;
150 struct list_arraynode *next;
151} list_arraynode_t;
152
153typedef struct list_treenode
154{
155 list_arraynode_t *data;
156 int count;
157 struct list_treenode *left;
158 struct list_treenode *right;
159} list_treenode_t;
160
161typedef int (*list_sort_func)(void *data1, void *data2);
162typedef void (*list_free_func)(void *data);
163
164typedef struct list_node
165{
166 uint32 size;
167 list_sort_func sort_func;
168 list_free_func free_func;
169
170 uint32 cur_index;
171 list_arraynode_t *cur_array_data;
172
173 list_arraynode_t array_data;
174 list_treenode_t tree_data;
175} list_node_t;
176
177/*
1780: GSM
1791: GSM Compact
1802: UTRAN
1813: GSM w/EGPRS
1824: UTRAN w/HSDPA
1835: UTRAN w/HSUPA
1846: UTRAN w/HSDPA and HSUPA
1857: E-UTRAN
1868: UTRAN HSPA+
187*/
188typedef enum {
189 MBTK_RADIO_TECH_GSM = 0,
190 MBTK_RADIO_TECH_GSM_COMPACT,
191 MBTK_RADIO_TECH_UTRAN,
192 MBTK_RADIO_TECH_GSM_EGPRS,
193 MBTK_RADIO_TECH_UTRAN_HSDPA,
194 MBTK_RADIO_TECH_UTRAN_HSUPA,
195 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
196 MBTK_RADIO_TECH_E_UTRAN, // LTE
197 MBTK_RADIO_TECH_UTRAN_HSPA
198} mbtk_radio_technology_enum;
199
200typedef struct
201{
202 /*
203 0: automatic
204 1: manual
205 */
206 uint8 net_sel_mode;
207 /*
208 0: GSM
209 1: GSM Compact
210 2: UTRAN
211 3: GSM w/EGPRS
212 4: UTRAN w/HSDPA
213 5: UTRAN w/HSUPA
214 6: UTRAN w/HSDPA and HSUPA
215 7: E-UTRAN
216 8: UTRAN HSPA+
217 0xFF: Unused
218 */
219 uint8 net_type;
220 //uint8 plmn[10]; // 46000
221 /*
222 0: unknown
223 1: available
224 2: current
225 3: forbidden
226 */
227 uint8 net_state;
228 uint32 plmn;
229} __attribute__((packed)) mbtk_net_info_t;
230
231
232typedef enum
233{
234 MBTK_NET_REG_STATE_NON = 0,
235 MBTK_NET_REG_STATE_HOME,
236 MBTK_NET_REG_STATE_SEARCHING,
237 MBTK_NET_REG_STATE_DENIED,
238 MBTK_NET_REG_STATE_UNKNOWN,
239 MBTK_NET_REG_STATE_ROAMING,
240 MBTK_NET_REG_STATE_SMS_ONLY,
241 MBTK_NET_REG_STATE_ROAMING_SMS,
242 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
243 MBTK_NET_REG_STATE_CSFB_HOME,
244 MBTK_NET_REG_STATE_CSFB_ROAMING,
245 MBTK_NET_REG_STATE_EMERGENCY_ONLY
246} mbtk_net_reg_state_enum;
247
248typedef struct
249{
250 uint8 call_state;// mbtk_net_reg_state_enum
251 uint8 data_state;// mbtk_net_reg_state_enum
252 uint8 ims_state;// mbtk_net_reg_state_enum
253 uint8 type; // mbtk_radio_technology_enum
254 uint16 lac;
255 uint32 ci;
256} __attribute__((packed)) mbtk_net_reg_info_t;
257
258typedef struct
259{
260 uint8 type; // mbtk_radio_technology_enum
261 uint8 rssi; // 0: 113 dBm or less
262 // 1: 111 dBm
263 // 2��30: 109��53 dBm
264 // 31: 51 dBm or greater
265 // 99: not known or not detectable
266 uint8 rxlev;// 0:rssi < -110 dBm
267 // 1: -110 dBm �� rssi < -109 dBm
268 // 2: -109 dBm �� rssi < -108 dBm
269 // ......
270 // 61: -50 dBm �� rssi < -49 dBm
271 // 62: -49 dBm �� rssi < -48 dBm
272 // 63: -48 dBm �� rssi
273 // 99: not known or not detectable
274 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
275 // 99 not known or not detectable
276 uint8 rscp; // 0: rscp < -120 dBm
277 // 1: -120 dBm �� rscp < -119 dBm
278 // 2: -119 dBm �� rscp < -118 dBm
279 // ......
280 // 94: -27 dBm �� rscp < -26 dBm
281 // 95: -26 dBm �� rscp < -25 dBm
282 // 96: - 25 dBm �� rscp
283 // 255: not known or not detectable
284 uint8 ecno; // 0: Ec/Io < -24 dB
285 // 1: -24 dB �� Ec/Io < -23.5 dB
286 // 2: -23.5 dB �� Ec/Io < -23 dB
287 // ......
288 // 47: -1 dB �� Ec/Io < -0.5 dB
289 // 48: -0.5 dB �� Ec/Io < 0 dB
290 // 49: 0 dB �� Ec/Io
291 // 255: not known or not detectable
292 uint8 rsrq; // 0: rsrq < -19.5 dB
293 // 1: -19.5 dB �� rsrq < -19 dB
294 // 2: -19 dB �� rsrq < -18.5 dB
295 // ......
296 // 32: -4 dB �� rsrq < -3.5 dB
297 // 33: -3.5 dB �� rsrq < -3 dB
298 // 34: -3 dB �� rsrq
299 // 255: not known or not detectable
300 uint8 rsrp; // 0: rsrp < -140 dBm
301 // 1: -140 dBm �� rsrp < -139 dBm
302 // 2: -139 dBm �� rsrp < -138 dBm
303 // ......
304 // 95: -46 dBm �� rsrp < -45 dBm
305 // 96: -45 dBm �� rsrp < -44 dBm
306 // 97: -44 dBm �� rsrp
307 // 255: not known or not detectable
q.huang861c07d2025-06-24 16:54:58 +0800308 int8 sinr; //-20-35 dbm
b.liu68a94c92025-05-24 12:53:41 +0800309} __attribute__((packed)) mbtk_signal_info_t;
310
311typedef struct{
312 uint8_t mode;
313 uint32_t oosPhase[3]; //单位为秒
314} mbtk_oos_info;
315
316typedef struct
317{
318 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
319 int t_min;
320 int t_step;
321 int t_max;
322}GSW_NW_OOS_CONFIG_INFO_T;
323
b.liu68a94c92025-05-24 12:53:41 +0800324#define lib_mbtk_path "/lib/libmbtk_lib.so"
325mbtk_info_handle_t* nw_info_handle = NULL;
326
q.huang638d5872025-06-21 13:44:43 +0800327static GSW_NW_ServingInfoHandlePtr serving_cb=NULL;
328static GSW_NW_SigInfoHandlePtr sig_cb=NULL;
329static GSW_NW_RejectCauseHandlePtr reject_cb=NULL;
330static GSW_NW_ModemStateHandlePtr modem_cb=NULL;
331static GSW_NW_AirplaneModeHandlePtr airplane_cb=NULL;
b.liu68a94c92025-05-24 12:53:41 +0800332
333static void *dlHandle_mbtk;
334int nw_init_flag = 0;
335int mode = -1;
336int fplmn_max_length = 0;
337
338gsw_nw_plmn_list_t gsw_nw_plmn_list;
339char fplmn_array[FPLMN_ARRAY_SIZE][7];
340int fplmn_index = 0;
341
342static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
343static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
344int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
345int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
346int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
347int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
348static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
349int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
350int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
351int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
352int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
353int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
354int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
355int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
356int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
357int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
358int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
359int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
q.huang238b22a2025-06-10 14:36:59 +0800360int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
q.huangdaa16d42025-07-03 14:32:48 +0800361bool (*str_empty)(const void *str);
q.huang238b22a2025-06-10 14:36:59 +0800362
b.liu68a94c92025-05-24 12:53:41 +0800363
364static void (*mbtk_log)(int level, const char *format, ...);
365static void (*mbtk_log_init)(char *path, char *tag);
366
367#ifndef LOG_ERR_LEVEL
368#define LOG_ERR_LEVEL 3 /* error conditions */
369#endif
370#ifndef LOG_WARN_LEVEL
371#define LOG_WARN_LEVEL 4 /* warning conditions */
372#endif
373#ifndef LOG_INFO_LEVEL
374#define LOG_INFO_LEVEL 6 /* informational */
375#endif
376#ifndef LOG_DEBUG_LEVEL
377#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
378#endif
379#ifndef LOG_VERBOSE_LEVEL
380#define LOG_VERBOSE_LEVEL 8
381#endif
382
l.yang6a42e4d2025-05-28 01:04:20 -0700383#define GSW_NW "[HAL][GSW_NW]"
384
b.liu68a94c92025-05-24 12:53:41 +0800385#define LOGV(fmt, args ...) \
386 do{ \
387 char *file_ptr_1001 = __FILE__; \
388 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
389 char line_1001[10] = {0}; \
390 sprintf(line_1001, "%d", __LINE__); \
391 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
392 if(*ptr_1001 == '/') \
393 break; \
394 ptr_1001--; \
395 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700396 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800397 } while(0)
398
399#define LOGI(fmt, args...) \
400 do{ \
401 char *file_ptr_1001 = __FILE__; \
402 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
403 char line_1001[10] = {0}; \
404 sprintf(line_1001, "%d", __LINE__); \
405 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
406 if(*ptr_1001 == '/') \
407 break; \
408 ptr_1001--; \
409 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700410 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800411 } while(0)
412
413#define LOGD(fmt, args...) \
414 do{ \
415 char *file_ptr_1001 = __FILE__; \
416 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
417 char line_1001[10] = {0}; \
418 sprintf(line_1001, "%d", __LINE__); \
419 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
420 if(*ptr_1001 == '/') \
421 break; \
422 ptr_1001--; \
423 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700424 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800425 } while(0)
426
427#define LOGW(fmt, args...) \
428 do{ \
429 char *file_ptr_1001 = __FILE__; \
430 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
431 char line_1001[10] = {0}; \
432 sprintf(line_1001, "%d", __LINE__); \
433 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
434 if(*ptr_1001 == '/') \
435 break; \
436 ptr_1001--; \
437 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700438 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800439 } while(0)
440
441#define LOGE(fmt, args...) \
442 do{ \
q.huangfa0a0a32025-06-12 17:07:23 +0800443 char *file_ptr_1001 = __FILE__; \
b.liu68a94c92025-05-24 12:53:41 +0800444 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
445 char line_1001[10] = {0}; \
446 sprintf(line_1001, "%d", __LINE__); \
447 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
448 if(*ptr_1001 == '/') \
449 break; \
450 ptr_1001--; \
451 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700452 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800453 } while(0)
454
455
456
457typedef struct
458{
459 char *lynq_operator_l;
460 char *lynq_operator_s;
461 uint32 lynq_mcc_mnc;
462} lynq_operator_mcc_mnc_t;
463
464static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
465{
466 {"China Mobile","CMCC",46000},
467 {"China Unicom","CU",46001},
468 {"China Mobile","CMCC",46002},
469 {"China Telecom","CT",46003},
470 {"China Mobile","CMCC",46004},
471 {"China Telecom","CT",46005},
472 {"China Unicom","CU",46006},
473 {"China Mobile","CMCC",46007},
474 {"China Mobile","CMCC",46008},
475 {"China Unicom","CU",46009},
476 {"China Telecom","CT",46011}
477};
478
479
480//GSW include
481typedef enum prefer_mode
482{
483 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
484 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
485 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
486 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
487 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
488 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
489 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
490 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
491} PREFER_MODE_E;
492
493static int mbtk_nw_api_import()
494{
495 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
496 if (dlHandle_mbtk == NULL)
497 {
xy.heb41615b2025-05-28 16:33:20 +0800498 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800499 }
500
501 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
502 if (mbtk_log_init == NULL)
503 {
xy.heb41615b2025-05-28 16:33:20 +0800504 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800505 }
506
507 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
508 if (mbtk_log == NULL)
509 {
xy.heb41615b2025-05-28 16:33:20 +0800510 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800511 }
512
513 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
514 if (mbtk_info_handle_get == NULL)
515 {
516 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800517 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800518 }
519
520 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
521 if (mbtk_info_handle_free == NULL)
522 {
523 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800524 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800525 }
526
527 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
528 if (mbtk_net_sel_mode_get == NULL)
529 {
530 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800531 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800532 }
533
534 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
535 if (mbtk_net_reg_get == NULL)
536 {
537 LOGE("mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800538 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800539 }
540
541 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
542 if (mbtk_get_modem_fun == NULL)
543 {
544 LOGE("mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800545 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800546 }
547
548 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
549 if (mbtk_set_modem_fun == NULL)
550 {
551 LOGE("mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800552 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800553 }
554
555 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
556 if (mbtk_current_band_get == NULL)
557 {
558 LOGE("mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800559 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800560 }
561
562 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
563 if (mbtk_current_band_set == NULL)
564 {
565 LOGE("mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800566 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800567 }
568
569 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
570 if (mbtk_net_signal_get == NULL)
571 {
572 LOGE("mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800573 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800574 }
575
576 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
577 if (mbtk_wakeup_state_set == NULL)
578 {
579 LOGE("mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800580 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800581 }
582
583 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");
584 if (mbtk_cell_get == NULL)
585 {
586 LOGE("mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800587 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800588 }
589
590 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");
591 if (mbtk_signal_state_change_cb_reg == NULL)
592 {
593 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800594 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800595 }
596
597 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");
598 if (mbtk_net_state_change_cb_reg == NULL)
599 {
600 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800601 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800602 }
603
604 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
605 if (mbtk_fplmn_get == NULL)
606 {
607 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800608 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800609 }
610
611 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
612 if (mbtk_fplmn_set == NULL)
613 {
614 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800615 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800616 }
617
618 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");
619 if (mbtk_radio_state_change_cb_reg == NULL)
620 {
621 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800622 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800623 }
624
625 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
626 if (mbtk_oos_get == NULL)
627 {
628 LOGE("mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800629 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800630 }
631
632 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
633 if (mbtk_oos_set == NULL)
634 {
635 LOGE("mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800636 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800637 }
q.huang238b22a2025-06-10 14:36:59 +0800638
639 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
640 if (mbtk_imei_get == NULL)
641 {
642 LOGE("mbtk_imei_get dlsym fail\n");
643 return GSW_HAL_NORMAL_FAIL;
644 }
q.huangdaa16d42025-07-03 14:32:48 +0800645
646 str_empty = (bool (*)(const void *str))dlsym(dlHandle_mbtk, "str_empty");
647 if (str_empty == NULL)
648 {
649 LOGE("str_empty dlsym fail\n");
650 return GSW_HAL_NORMAL_FAIL;
651 }
b.liu68a94c92025-05-24 12:53:41 +0800652
653 return GSW_HAL_SUCCESS;
654}
655
656void list_first(list_node_t *list)
657{
658 if (list) {
659 list->cur_index = 0;
660 list->cur_array_data = list->array_data.next;
661 }
662}
663
664void* list_next(list_node_t *list)
665{
666 if (list) {
667 list_arraynode_t *node = list->cur_array_data;
668 if (node) {
669 LOGE("node is not null\n");
670 list->cur_array_data = list->cur_array_data->next;
671 list->cur_index++;
672 return node->data;
673 } else {
674 LOGE("node is null\n");
675 return NULL;
676 }
677 } else {
678 LOGE("list is null\n");
679 return NULL;
680 }
681}
682
683void list_free(list_node_t *list)
684{
685 if (list) {
686 list_arraynode_t *node = &(list->array_data); // Head node
687 list_arraynode_t *node_temp = NULL;
688 while (node->next) {
689 node_temp = node->next;
690 node->next = node->next->next;
691
692 if (list->free_func) {
693 list->free_func(node_temp->data);
694 } else {
695 free(node_temp->data);
696 }
697 free(node_temp);
698 }
699 free(list);
700 }
701}
702
q.huang861c07d2025-06-24 16:54:58 +0800703#if 0
q.huang638d5872025-06-21 13:44:43 +0800704static int32_t gsm_rssi_convert_to_dBm(uint8 rssi)
705{
706 if(rssi <= 31)
707 {
708 return rssi * 2 - 113; //0 map -113
709 //31 map -51
710 }
711 else
712 {
713 return INT_32_MAX;
714 }
715}
q.huang861c07d2025-06-24 16:54:58 +0800716#endif
q.huang638d5872025-06-21 13:44:43 +0800717
q.huangfa0a0a32025-06-12 17:07:23 +0800718static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
b.liu68a94c92025-05-24 12:53:41 +0800719{
q.huangfa0a0a32025-06-12 17:07:23 +0800720 if(rscp <= 96)
b.liu68a94c92025-05-24 12:53:41 +0800721 {
q.huangfa0a0a32025-06-12 17:07:23 +0800722 return 121-rscp; // 96 map 25
723 // 0 map -121, below -120
b.liu68a94c92025-05-24 12:53:41 +0800724 }
b.liu68a94c92025-05-24 12:53:41 +0800725 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.huangfa0a0a32025-06-12 17:07:23 +0800731static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
b.liu68a94c92025-05-24 12:53:41 +0800732{
q.huangfa0a0a32025-06-12 17:07:23 +0800733 if(rsrp <= 97)
b.liu68a94c92025-05-24 12:53:41 +0800734 {
q.huangfa0a0a32025-06-12 17:07:23 +0800735 return 141-rsrp; // 97 map 44
736 // 0 map 141 below 140
b.liu68a94c92025-05-24 12:53:41 +0800737 }
738 else
739 {
q.huangfa0a0a32025-06-12 17:07:23 +0800740 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800741 }
742}
743
q.huangfa0a0a32025-06-12 17:07:23 +0800744static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
b.liu68a94c92025-05-24 12:53:41 +0800745{
q.huangfa0a0a32025-06-12 17:07:23 +0800746 if(rsrq <= 34)
b.liu68a94c92025-05-24 12:53:41 +0800747 {
q.huangfa0a0a32025-06-12 17:07:23 +0800748 return (40-rsrq)/2; //=20-rsrq / 2;
749 // 34 map 3
750 // 0 map 20
b.liu68a94c92025-05-24 12:53:41 +0800751 }
752 else
753 {
q.huangfa0a0a32025-06-12 17:07:23 +0800754 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800755 }
756}
757
q.huang861c07d2025-06-24 16:54:58 +0800758static int32_t sinr_convert_to_10_times_dB(int8 sinr)
q.huang638d5872025-06-21 13:44:43 +0800759{
760 if(sinr <=35 && sinr>=-20)
761 {
762 return sinr*10; //35 map 350 db
763 // -20 map -2000 db
764 }
765 else
766 {
767 return INT_32_MAX;
768 }
769}
770
771
772static int32_t rscp_minus_dbm_convert_to_rssi_dBm(int32_t rscp)
773{
774 if(rscp!=INT_32_MAX)
775 {
776 return -rscp;
777 }
778 else
779 {
780 return INT_32_MAX;
781 }
782}
783
784static int32_t rsrp_minus_dbm_convert_to_rssi_dBm(int32_t rsrp)
785{
786 if(rsrp!=INT_32_MAX)
787 {
788 return -rsrp;
789 }
790 else
791 {
792 return INT_32_MAX;
793 }
794}
795
q.huang861c07d2025-06-24 16:54:58 +0800796static int32_t rxlev_convert_to_rssi_dBm(uint8 rxlev)
797{
798 if(rxlev<=63)
799 {
800 return rxlev-111; //0 map -111, below -110
801 // 63 map -48
802 }
803 else
804 {
805 return INT_32_MAX;
806 }
807
808}
b.liu68a94c92025-05-24 12:53:41 +0800809
q.huangfa0a0a32025-06-12 17:07:23 +0800810//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
811// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
812// * will be 125.*/
813//uint8 ecno; // 0: Ec/Io < -24 dB
814 // 1: -24 dB �� Ec/Io < -23.5 dB
815 // 2: -23.5 dB �� Ec/Io < -23 dB
816 // ......
817 // 47: -1 dB �� Ec/Io < -0.5 dB
818 // 48: -0.5 dB �� Ec/Io < 0 dB
819 // 49: 0 dB �� Ec/Io
820 // 255: not known or not detectabl
821static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
b.liu68a94c92025-05-24 12:53:41 +0800822{
q.huangfa0a0a32025-06-12 17:07:23 +0800823 if(ecno <=49)
b.liu68a94c92025-05-24 12:53:41 +0800824 {
q.huangfa0a0a32025-06-12 17:07:23 +0800825 return 245-ecno*5; //49 map 0 db
826 // 1 map 240 db
827 // 0 map 245 below 240
b.liu68a94c92025-05-24 12:53:41 +0800828 }
q.huangfa0a0a32025-06-12 17:07:23 +0800829 else
b.liu68a94c92025-05-24 12:53:41 +0800830 {
q.huangfa0a0a32025-06-12 17:07:23 +0800831 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800832 }
833}
834
b.liu68a94c92025-05-24 12:53:41 +0800835
b.liu68a94c92025-05-24 12:53:41 +0800836
q.huangfa0a0a32025-06-12 17:07:23 +0800837/* change realCsq to level */
838static int rscpToLevel(int rscp)
b.liu68a94c92025-05-24 12:53:41 +0800839{
q.huangfa0a0a32025-06-12 17:07:23 +0800840
841 if (rscp < -110) {
b.liu68a94c92025-05-24 12:53:41 +0800842 return 0;
q.huangfa0a0a32025-06-12 17:07:23 +0800843 } else if (rscp <= -95) {
844 return rscp+111; // to 16
845 } else if (rscp >=-93 && rscp <=-90) {
846 return rscp+110; // to 20
847 } else if (rscp >=-89 && rscp <=-59) {
848 return (rscp+152)/3; // =(rscp+89)/3+21 to 31
849 } else if (rscp ==- 94) { // Geely requirement, -94 map 16
850 return 16;
851 } else if(rscp <= -25) {
852 return 31;
b.liu68a94c92025-05-24 12:53:41 +0800853 }
q.huangfa0a0a32025-06-12 17:07:23 +0800854 return 99;
b.liu68a94c92025-05-24 12:53:41 +0800855}
856
q.huangfa0a0a32025-06-12 17:07:23 +0800857static int rsrpToLevel(int rsrp)
858{
859 if (rsrp < -130) {
860 return 0;
861 } else if (rsrp <= -118) {
862 return (rsrp+132)/2; // to 7
863 } else if (rsrp <=-109) {
864 return rsrp+125; // to 16
865 } else if (rsrp <=-103) {
866 return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
867 } else if (rsrp <=- 85) {
868 return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
869 } else if(rsrp <= -55) {
870 return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
871 } else if(rsrp <=-44)
872 {
873 return 31;
874 }
875 return 99;
876}
877
q.huang861c07d2025-06-24 16:54:58 +0800878//uint8 rssi; // 0: 113 dBm or less
879 // 1: 111 dBm
880 // 2��30: 109��53 dBm
881 // 31: 51 dBm or greater
882 // 99: not known or not detectable
883//uint8 rxlev;// 0:rssi < -110 dBm
884 // 1: -110 dBm �� rssi < -109 dBm
885 // 2: -109 dBm �� rssi < -108 dBm
886 // 60 ......
887 // 61: -50 dBm �� rssi < -49 dBm
888 // 62: -49 dBm �� rssi < -48 dBm
889 // 63: -48 dBm �� rssi
890 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +0800891
q.huang861c07d2025-06-24 16:54:58 +0800892/* change realCsq to level */
893static int rxlevToLevel(uint8 rxlev)
894{
895 if (rxlev <=60) {
896 return (rxlev+3)/2; // =(rxlev+1)/2+1,
897 // 0 map 1
898 // 1,2 map 2
899 // 59,60 map 31
900 }
901 else if(rxlev <=63)
902 {
903 return 31;
904 }
905 return 99;
906}
b.liu68a94c92025-05-24 12:53:41 +0800907
908static int convert_reg_state(int reg_state_t)
909{
910 LOGD("reg_state_t = %d\n",reg_state_t);
911 int reg_state = 0;
912
913 switch (reg_state_t)
914 {
915 case MBTK_NET_REG_STATE_NON:
916 {
917 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
918 break;
919 }
920 case MBTK_NET_REG_STATE_HOME:
921 {
922 reg_state = GSW_NETWORK_REG_REGISTERED;
923 break;
924 }
925 case MBTK_NET_REG_STATE_SEARCHING:
926 {
927 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
928 break;
929 }
930 case MBTK_NET_REG_STATE_DENIED:
931 {
932 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
933 break;
934 }
935 case MBTK_NET_REG_STATE_UNKNOWN:
936 {
937 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
938 break;
939 }
940 case MBTK_NET_REG_STATE_ROAMING:
941 {
942 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
943 break;
944 }
945 case MBTK_NET_REG_STATE_SMS_ONLY:
946 case MBTK_NET_REG_STATE_ROAMING_SMS:
947 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
948 case MBTK_NET_REG_STATE_CSFB_HOME:
949 case MBTK_NET_REG_STATE_CSFB_ROAMING:
950 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
951 {
952 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
953 break;
954 }
955 }
956
957 return reg_state;
958}
959
960
961static int convert_net_mode(int net_mode)
962{
963 LOGD("net_mode = %d\n",net_mode);
964 switch(net_mode)
965 {
966 case MBTK_RADIO_TECH_GSM:
967 case MBTK_RADIO_TECH_GSM_COMPACT:
968 case MBTK_RADIO_TECH_GSM_EGPRS:
969 {
970 return GSW_NETWORK_RADIO_GSM;
971 }
972 case MBTK_RADIO_TECH_UTRAN:
973 case MBTK_RADIO_TECH_UTRAN_HSDPA:
974 case MBTK_RADIO_TECH_UTRAN_HSUPA:
975 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
976 case MBTK_RADIO_TECH_UTRAN_HSPA:
977 {
978 return GSW_NETWORK_RADIO_UMTS;
979 }
980 case MBTK_RADIO_TECH_E_UTRAN:
981 {
982 return GSW_NETWORK_RADIO_LTE;
983 }
984
985 default:
986 {
987 return GSW_NETWORK_RADIO_NO_SVC;
988 }
989 }
990
991 return GSW_NETWORK_RADIO_NO_SVC;
992}
993
994static int convert_mbtk_net_config(int config)
995{
996 int net_pref = -1;
997
998 switch(config)
999 {
1000 case GSW_PREFER_MODE_GSW:
1001 {
1002 net_pref = 0;
1003 break;
1004 }
1005
1006 case GSW_PREFER_MODE_WCDMA:
1007 {
1008 net_pref = 1;
1009 break;
1010 }
1011
1012 case GSW_PREFER_MODE_WCDMA_GSM:
1013 {
1014 net_pref = 2;
1015 break;
1016 }
1017
1018 case GSW_PREFER_MODE_LTE:
1019 case GSW_PREFER_MODE_NR5G:
1020 case GSW_PREFER_MODE_NR5G_LTE:
1021 {
1022 net_pref = 5;
1023 break;
1024 }
1025
1026 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
1027 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
1028 {
1029 net_pref = 15;
1030 break;
1031 }
1032 }
1033
1034 return net_pref;
1035}
1036
1037
1038static int convert_gsw_net_config(int config)
1039{
1040 int net_config = -1;
q.huang72680852025-06-11 13:42:21 +08001041 LOGD("config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +08001042
1043 switch (config)
1044 {
1045 case 0:
1046 {
1047 net_config = GSW_PREFER_MODE_GSW;
1048 break;
1049 }
1050
1051 case 1:
1052 {
1053 net_config = GSW_PREFER_MODE_WCDMA;
1054 break;
1055 }
1056
1057 case 2:
1058 {
1059 net_config = GSW_PREFER_MODE_WCDMA_GSM;
1060 break;
1061 }
1062
1063 case 5:
1064 {
1065 net_config = GSW_PREFER_MODE_LTE;
1066 break;
1067 }
1068
1069 case 15:
1070 {
1071 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
1072 break;
1073 }
1074 }
1075
1076 return net_config;
1077}
1078
1079//64F010 -> 46001 (64->46,F0->0,10->01)
1080static void transform_fplmn_str_to_plmn(char *entry)
1081{
1082 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
1083 return; //if FFFFFF,means invalid fplmn, do nothing
1084 }
1085
1086 char temp = entry[0];
1087 entry[0] = entry[1];
1088 entry[1] = temp;
1089
1090 temp = entry[ENTRY_LENGTH - 2];
1091 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
1092 entry[ENTRY_LENGTH - 1] = temp;
1093
1094 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
1095
1096 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
1097
1098 //valid fplmn
1099 fplmn_index++;
1100}
1101
1102static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
1103{
1104 strncpy(mcc,entry,3);
1105 mcc[3] = '\0';
1106 strncpy(mnc,entry + 3,2);
1107 mnc[2] = '\0';
1108
1109 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
1110}
1111
1112
1113static void update_fplmn_list(char *fplmn_str)
1114{
1115 LOGE("fplmn_str = %s\n",fplmn_str);
1116 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
1117 memset(fplmn_array, 0, sizeof(fplmn_array));
1118 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
1119 fplmn_index = 0;
1120 int array_length = 0;
1121
1122 for (int i = 0; i < strlen(fplmn_str); i += 6) {
1123
1124 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
1125 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
1126 temp_fplmn_array[array_length][length] = '\0';
1127 array_length++;
1128 if (i + 6 >= strlen(fplmn_str)) {
1129 break;
1130 }
1131 }
1132
1133 for (int i = 0; i < array_length; i++) {
1134 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
1135 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1136 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
1137 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
1138 }
1139
1140}
1141
1142static void format_plmn(char *result, char *plmn_entry)
1143{
1144 strncpy(result, plmn_entry, strlen(plmn_entry));
1145 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1146
1147 if (strlen(result) >= 2) {
1148 char temp = result[0];
1149 result[0] = result[1];
1150 result[1] = temp;
1151 }
1152
1153 LOGE("1.result = %s\n",result);
1154
1155 if (strlen(result) >= 3) {
1156 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1157 result[2] = 'F';
1158 }
1159
1160 LOGE("2.result = %s\n",result);
1161
1162 if (strlen(result) >= 2) {
1163 char temp = result[strlen(result) - 1];
1164 result[strlen(result) - 1] = result[strlen(result) - 2];
1165 result[strlen(result) - 2] = temp;
1166 }
1167
1168 LOGE("3.result = %s\n",result);
1169}
1170
1171
1172static void convert_plmn_to_fplmn_str(char *fplmn_str)
1173{
1174 char temp_fplmn_str[128] = {0};
1175 char temp[20]; // 临时存储单个格式化后的数字
1176 int index = 0;
1177
1178 for (int i = 0; i < fplmn_index; i++) {
1179 memset(temp, 0x0, sizeof(temp));
1180 format_plmn(temp, fplmn_array[i]);
1181 strcat(temp_fplmn_str, temp);
1182 index += strlen(temp);
1183 }
1184
1185 while(index < (6 * fplmn_max_length))
1186 {
1187 temp_fplmn_str[index++] = 'F';
1188 }
1189
1190 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1191 if (index > (6 * fplmn_max_length)) {
1192 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1193 }
1194
1195 LOGE("%s\n", temp_fplmn_str);
1196 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1197 LOGE("fplmn_str = %s\n", fplmn_str);
1198}
1199
1200static int check_index(char *mcc, char *mnc)
1201{
1202 int i = 0;
1203
1204 for(i = 0; i < fplmn_index; i++)
1205 {
1206 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1207 {
1208 LOGE("index = %d\n", i);
1209 return i;
1210 }
1211 }
1212
1213 LOGE("not find\n");
1214 return -1;
1215}
1216
1217static void remove_fplmn(int index)
1218{
1219 int write_index = 0;
1220 for (int i = 0; i < fplmn_index; i++) {
1221 if (i != index) {
1222 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1223 }
1224 }
1225 fplmn_index--;
1226}
1227
q.huangfa0a0a32025-06-12 17:07:23 +08001228static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
1229{
1230 LOGD("signal->type=%d", signal->type);
1231 memset(sig_strength,0,sizeof (signalStrength_t));
1232 switch(signal->type)
1233 {
1234 case MBTK_RADIO_TECH_E_UTRAN:
1235 {
1236 LOGI("rsrp = %d",signal->rsrp);
1237 sig_strength->lte_sig_valid = 1;
q.huangc8b93122025-06-17 17:46:05 +08001238 sig_strength->rsrp = rsrp_convert_to_minus_dBm(signal->rsrp);
1239 sig_strength->rsrq = rsrq_convert_to_minus_dB(signal->rsrq);
q.huang638d5872025-06-21 13:44:43 +08001240 sig_strength->rssi = rsrp_minus_dbm_convert_to_rssi_dBm(sig_strength->rsrp);
q.huang861c07d2025-06-24 16:54:58 +08001241 sig_strength->rssnr= sinr_convert_to_10_times_dB(signal->sinr);
q.huangfa0a0a32025-06-12 17:07:23 +08001242 break;
1243 }
1244 case MBTK_RADIO_TECH_UTRAN:
1245 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1246 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1247 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1248 case MBTK_RADIO_TECH_UTRAN_HSPA:
1249 {
1250 LOGI("rscp = %d",signal->rscp);
1251 sig_strength->wcdma_sig_valid = 1;
1252 sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
1253 sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
q.huang638d5872025-06-21 13:44:43 +08001254 sig_strength->rssi = rscp_minus_dbm_convert_to_rssi_dBm(sig_strength->rscp);
q.huangfa0a0a32025-06-12 17:07:23 +08001255 break;
1256 }
1257 case MBTK_RADIO_TECH_GSM:
1258 case MBTK_RADIO_TECH_GSM_COMPACT:
1259 case MBTK_RADIO_TECH_GSM_EGPRS:
1260 {
q.huang861c07d2025-06-24 16:54:58 +08001261 LOGI("g rxlev = %d",signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001262 sig_strength->gw_sig_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08001263 sig_strength->rssi = rxlev_convert_to_rssi_dBm(signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001264 break;
1265 }
1266 default:
1267 {
1268 LOGE("[%s] unknown reg type.[%d]", __func__, signal->type);
1269 }
1270 }
1271
1272}
1273
q.huang66b79162025-06-27 17:45:34 +08001274/*
q.huangdaa16d42025-07-03 14:32:48 +08001275typedef enum{
1276 MBTK_READY_INIT = -1,
1277 MBTK_READY_SUCCESS,
1278 MBTK_READY_MODEM_FAIL,
1279 MBTK_READY_RESPONSE_FAIL,
1280 MBTK_READY_SOCKET_FAIL,
1281 MBTK_READY_RIL_FAIL
q.huang66b79162025-06-27 17:45:34 +08001282}mbtk_ready_status_type;
1283
q.huangdaa16d42025-07-03 14:32:48 +08001284typedef enum gsw_hal_nw_mode_state_type
1285{
1286 GSW_MODEM_STATE_UNKNOWN = 0,
1287 GSW_MODEM_STATE_ONLINE,
1288 GSW_MODEM_STATE_OFFLINE,
1289 GSW_SDK_STATE_SERVICE_DOWN,
1290 GSW_SDK_STATE_SERVICE_UP,// service down->up 需要routectl 重启
1291 GSW_SDK_STATE_GPS_DOWN,
1292 GSW_SDK_STATE_GPS_UP,
q.huang66b79162025-06-27 17:45:34 +08001293} gsw_mode_state_e;
1294
1295*/
1296
1297static void convert_uci_to_gsw_modem_state(int uci, int *state)
1298{
1299 switch(uci)
q.huangdaa16d42025-07-03 14:32:48 +08001300 {
q.huang66b79162025-06-27 17:45:34 +08001301 case MBTK_READY_SUCCESS:
1302 *state=GSW_MODEM_STATE_ONLINE;
1303 return;
1304 case MBTK_READY_INIT:
1305 *state=GSW_MODEM_STATE_UNKNOWN;
1306 return;
1307 }
1308 *state=GSW_MODEM_STATE_OFFLINE;
1309 return;
1310}
1311
1312
1313
1314
1315
q.huangfa0a0a32025-06-12 17:07:23 +08001316
b.liu68a94c92025-05-24 12:53:41 +08001317static void gsw_serving_info_callback_thread()
1318{
1319 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1320 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1321 int ret = -1;
1322 ret = gsw_get_nwinfo(serving_info);
1323 if(ret != 0)
1324 {
1325 LOGE("gsw_get_nwinfo failed\n");
1326 free(serving_info);
1327 return;
1328 }
1329
1330 if(serving_cb)
1331 {
1332 serving_cb(*serving_info);
1333 free(serving_info);
1334 }
1335}
1336
1337static void gsw_serving_info_callback(const void* data, int data_len)
1338{
1339 LOGE("gsw_serving_info_callback start\n");
1340
1341 if(data && data_len > 0)
1342 {
1343 pthread_t thread;
1344 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1345 }
1346
1347 else
1348 {
1349 LOGE("data is NULL\n");
1350 return;
1351 }
1352
1353}
1354
q.huangfa0a0a32025-06-12 17:07:23 +08001355/*typedef struct
1356{
13570 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
13581 uint8 rssi; // 0: 113 dBm or less
1359 // 1: 111 dBm
1360 // 2��30: 109��53 dBm
1361 // 31: 51 dBm or greater
1362 // 99: not known or not detectable
13632 uint8 rxlev;// 0:rssi < -110 dBm
1364 // 1: -110 dBm �� rssi < -109 dBm
1365 // 2: -109 dBm �� rssi < -108 dBm
1366 // ......
1367 // 61: -50 dBm �� rssi < -49 dBm
1368 // 62: -49 dBm �� rssi < -48 dBm
1369 // 63: -48 dBm �� rssi
1370 // 99: not known or not detectable
13713 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
1372 // 99 not known or not detectable
13734 uint8 rscp; // 0: rscp < -120 dBm
1374 // 1: -120 dBm �� rscp < -119 dBm
1375 // 2: -119 dBm �� rscp < -118 dBm
1376 // ......
1377 // 94: -27 dBm �� rscp < -26 dBm
1378 // 95: -26 dBm �� rscp < -25 dBm
1379 // 96: - 25 dBm �� rscp
1380 // 255: not known or not detectable
13815 uint8 ecno; // 0: Ec/Io < -24 dB
1382 // 1: -24 dB �� Ec/Io < -23.5 dB
1383 // 2: -23.5 dB �� Ec/Io < -23 dB
1384 // ......
1385 // 47: -1 dB �� Ec/Io < -0.5 dB
1386 // 48: -0.5 dB �� Ec/Io < 0 dB
1387 // 49: 0 dB �� Ec/Io
1388 // 255: not known or not detectable
13896 uint8 rsrq; // 0: rsrq < -19.5 dB
1390 // 1: -19.5 dB �� rsrq < -19 dB
1391 // 2: -19 dB �� rsrq < -18.5 dB
1392 // ......
1393 // 32: -4 dB �� rsrq < -3.5 dB
1394 // 33: -3.5 dB �� rsrq < -3 dB
1395 // 34: -3 dB �� rsrq
1396 // 255: not known or not detectable
13977 uint8 rsrp; // 0: rsrp < -140 dBm
1398 // 1: -140 dBm �� rsrp < -139 dBm
1399 // 2: -139 dBm �� rsrp < -138 dBm
1400 // ......
1401 // 95: -46 dBm �� rsrp < -45 dBm
1402 // 96: -45 dBm �� rsrp < -44 dBm
1403 // 97: -44 dBm �� rsrp
1404 // 255: not known or not detectable
14058 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
1406 // 1: -43 dB <= ss_rsrq < -42.5 dB
1407 // 2: -42.5 dB <= ss_rsrq < -42 dB
1408 // ......
1409 // 125: 19 dB <= ss_rsrq < 19.5 dB
1410 // 126: 19.5 dB <= ss_rsrq < 20 dB
1411 // 255: not known or not detectable
1412 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1413 // 1: -156 dBm <= ss_rsrp < -155 dBm
1414 // 2: -155 dBm <= ss_rsrp < -154 dBm
1415 // ......
1416 // 125: -32 dBm <= ss_rsrp < -31 dBm
1417 // 126: -31 dBm <= ss_rsrp
1418 // 255: not known or not detectable
1419 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1420 // 1: -23 dB  ss_sinr < -22.5 dB
1421 // 2: -22.5 dB  ss_sinr < -22 dB
1422 // ......
1423 // 125: 39 dB  ss_sinr < 39.5 dBm
1424 // 126: 39.5 dB  ss_sinr < 40 dB
1425 // 127: 40 dB  ss_sinr
1426 // 255: not known or not detectable
1427} __attribute__((packed)) mbtk_signal_info_t;
1428*/
b.liu68a94c92025-05-24 12:53:41 +08001429static void gsw_sig_info_callback(const void* data, int data_len)
1430{
q.huangfa0a0a32025-06-12 17:07:23 +08001431 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001432 {
b.liu68a94c92025-05-24 12:53:41 +08001433 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001434 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1435
b.liu68a94c92025-05-24 12:53:41 +08001436 if(sig_cb != NULL)
1437 {
1438 sig_cb(sig_strength);
1439 }
1440 }
b.liu68a94c92025-05-24 12:53:41 +08001441 else
1442 {
q.huangfa0a0a32025-06-12 17:07:23 +08001443 LOGE("data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001444 }
1445}
1446
q.huangc8b93122025-06-17 17:46:05 +08001447static void gsw_operating_mode_event_callback(const void* data, int data_len)
b.liu68a94c92025-05-24 12:53:41 +08001448{
q.huangc8b93122025-06-17 17:46:05 +08001449 LOGE("gsw_operating_mode_event_callback start\n");
b.liu68a94c92025-05-24 12:53:41 +08001450
q.huangc8b93122025-06-17 17:46:05 +08001451
b.liu68a94c92025-05-24 12:53:41 +08001452 if(data && data_len > 0)
1453 {
q.huangc8b93122025-06-17 17:46:05 +08001454 const uint8 *cfun_state = (const uint8*)data;
1455 LOGE("gsw_operating_mode_event_callback,data = %d\n", *cfun_state);
1456 if(airplane_cb != NULL)
b.liu68a94c92025-05-24 12:53:41 +08001457 {
q.huangc8b93122025-06-17 17:46:05 +08001458 airplane_cb(*cfun_state);
b.liu68a94c92025-05-24 12:53:41 +08001459 }
1460 }
1461
1462}
1463
q.huangdaa16d42025-07-03 14:32:48 +08001464
b.liu68a94c92025-05-24 12:53:41 +08001465static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1466{
1467 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1468
1469 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1470 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1471
1472 rej_cause->rej_cause = cause;
1473 rej_cause->rej_rat = rat;
1474 rej_cause->rej_domain = domain;
1475
1476 if(reject_cb != NULL)
1477 {
1478 LOGE("reject_cb is not NULL\n");
1479 reject_cb(rej_cause);
1480 }
1481 else
1482 {
1483 LOGE("reject_cb is NULL\n");
1484 }
1485
1486 free(rej_cause);
1487 LOGE("gsw_reject_callback end\n");
1488}
1489
xy.hec89938f2025-05-29 14:08:47 +08001490void gsw_sig_info_timer()
1491{
xy.hec89938f2025-05-29 14:08:47 +08001492 if(nw_init_flag == 0 || nw_info_handle == NULL)
1493 {
1494 return;
1495 }
1496
1497 mbtk_signal_info_t signal;
1498 signalStrength_t sig_strength;
1499
1500 while(nw_init_flag)
1501 {
q.huangfa0a0a32025-06-12 17:07:23 +08001502 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001503 if(ret != 0)
1504 {
q.huangfa0a0a32025-06-12 17:07:23 +08001505 LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);
q.huang66b79162025-06-27 17:45:34 +08001506
xy.hec89938f2025-05-29 14:08:47 +08001507 }
xy.hec89938f2025-05-29 14:08:47 +08001508 else
1509 {
q.huangfa0a0a32025-06-12 17:07:23 +08001510 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
q.huang66b79162025-06-27 17:45:34 +08001511 if(sig_cb != NULL)
1512 {
1513 sig_cb(sig_strength);
1514 }
xy.hec89938f2025-05-29 14:08:47 +08001515 }
xy.hec89938f2025-05-29 14:08:47 +08001516 sleep(SIG_TIMER);
1517 }
1518}
1519
q.huangdaa16d42025-07-03 14:32:48 +08001520int get_sdk_ready()
1521{
1522 char buffer[MBTK_READY_STRING_SIZE_MAX];
1523 FILE *fp = popen(SDK_READY_CMD, "r");
1524 if(NULL == fp)
1525 {
1526 LOGE("popen sdk ready fail");
1527 return -1;
1528 }
1529 memset(buffer,0,sizeof(buffer));
1530 if(fgets(buffer, sizeof(buffer), fp) == NULL)
1531 {
1532 pclose(fp);
1533 LOGE("fgets failed:");
1534 return -1;
1535 }
1536 pclose(fp);
1537 LOGE("get_sdk_ready:%s",buffer);
1538 return atoi(buffer);
1539}
1540
q.huang66b79162025-06-27 17:45:34 +08001541int gsw_get_modem_state(int *state)
1542{
q.huangdaa16d42025-07-03 14:32:48 +08001543 int uci_value = get_sdk_ready();
1544 if(uci_value < 0)
q.huang66b79162025-06-27 17:45:34 +08001545 {
q.huangdaa16d42025-07-03 14:32:48 +08001546 return GSW_HAL_NORMAL_FAIL;
q.huang66b79162025-06-27 17:45:34 +08001547 }
q.huangdaa16d42025-07-03 14:32:48 +08001548 convert_uci_to_gsw_modem_state(uci_value,state);
1549 return GSW_HAL_SUCCESS;
q.huang66b79162025-06-27 17:45:34 +08001550}
1551
1552int g_mode_state=((int)(GSW_MODEM_STATE_UNKNOWN))-1;
1553void gsw_modem_state_timer()
1554{
1555 while(nw_init_flag)
1556 {
q.huangdaa16d42025-07-03 14:32:48 +08001557 int state;
1558 int ret = gsw_get_modem_state(&state);
q.huang66b79162025-06-27 17:45:34 +08001559 if(modem_cb != NULL)
1560 {
q.huang66b79162025-06-27 17:45:34 +08001561 if(ret != 0)
1562 {
q.huangdaa16d42025-07-03 14:32:48 +08001563 modem_cb(GSW_MODEM_STATE_UNKNOWN);
q.huang66b79162025-06-27 17:45:34 +08001564 }
1565 else if(state!=g_mode_state)
1566 {
1567 LOGE("modem state changed from %d to %d",g_mode_state,state);
1568 g_mode_state=state;
1569 modem_cb(state);
1570 }
1571 }
1572 sleep(MODEM_TIMER);
1573 }
1574}
1575
1576
b.liu68a94c92025-05-24 12:53:41 +08001577
1578/**
1579 * @brief SDK interface to call back serving info
1580 * @param [in] handle_ptr
1581 * @retval 0: success
1582 * @retval other: fail
1583 */
1584int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1585{
1586 if (nw_init_flag == 0 || nw_info_handle == NULL)
1587 {
xy.heb41615b2025-05-28 16:33:20 +08001588 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001589 }
1590
1591 if(handle_ptr == NULL)
1592 {
1593 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001594 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001595 }
1596
1597 serving_cb = handle_ptr;
1598
1599 return GSW_HAL_SUCCESS;
1600
1601}
1602
1603
1604/**
1605 * @brief SDK interface to call back sig info
1606 * @param [in] handle_ptr
1607 * @retval 0: success
1608 * @retval other: fail
1609 */
1610int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1611{
1612 if (nw_init_flag == 0 || nw_info_handle == NULL)
1613 {
xy.heb41615b2025-05-28 16:33:20 +08001614 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001615 }
1616
1617 if(handle_ptr == NULL)
1618 {
1619 LOGE("handle_ptr is NULL\n");
q.huang66b79162025-06-27 17:45:34 +08001620 sig_cb=NULL;
1621 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08001622 }
1623
1624 sig_cb = handle_ptr;
1625
1626 return GSW_HAL_SUCCESS;
1627
1628}
1629
1630
1631/**
1632 * @brief SDK interface to call back rej cause
1633 * @param [in] handle_ptr
1634 * @retval 0: success
1635 * @retval other: fail
1636 */
1637int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1638{
1639 if (nw_init_flag == 0 || nw_info_handle == NULL)
1640 {
xy.heb41615b2025-05-28 16:33:20 +08001641 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001642 }
1643
1644 if(handle_ptr == NULL)
1645 {
1646 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001647 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001648 }
1649
1650 reject_cb = handle_ptr;
1651
1652 return GSW_HAL_SUCCESS;
1653}
1654
1655
1656/**
1657 * @brief network sdk init
1658 * @param [in] token usr id define by who use
1659 * @retval 0: success
1660 * @retval other: fail
1661 */
1662int gsw_nw_sdk_init(int token)
1663{
1664 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001665 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001666
1667 if (nw_init_flag == 1 && nw_info_handle != NULL)
1668 {
1669 return GSW_HAL_SUCCESS;
1670 }
1671
1672 ret = mbtk_nw_api_import();
1673 if (ret != 0)
1674 {
q.huangdaa16d42025-07-03 14:32:48 +08001675 printf("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001676 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001677 }
1678
1679 nw_info_handle = mbtk_info_handle_get();
1680
1681 if (nw_info_handle == NULL)
1682 {
1683 LOGE("mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001684 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001685 }
1686
1687 char fplmn[256] = {0};
1688 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1689 if(ret != 0)
1690 {
1691 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001692 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001693 }
1694 fplmn_max_length = (strlen(fplmn)/6);
1695 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1696 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1697
1698 if (ret != 0)
1699 {
1700 LOGE("mbtk_signal_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001701 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001702 }
1703
1704 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1705 if (ret != 0)
1706 {
1707 LOGE("mbtk_net_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001708 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001709 }
1710
q.huang66b79162025-06-27 17:45:34 +08001711 nw_init_flag = 1;
1712
xy.hec89938f2025-05-29 14:08:47 +08001713 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1714 if (ret != 0)
1715 {
q.huang66b79162025-06-27 17:45:34 +08001716 LOGE("pthread_create fail,ret is %d", ret);
1717 nw_init_flag = 0;
1718 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
xy.hec89938f2025-05-29 14:08:47 +08001719 }
1720
q.huang66b79162025-06-27 17:45:34 +08001721
1722 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_modem_state_timer, NULL);
1723 if (ret != 0)
1724 {
1725 LOGE("pthread_create fail 2,ret is %d", ret);
1726 nw_init_flag = 0;
1727 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
1728 }
b.liu68a94c92025-05-24 12:53:41 +08001729
1730 return GSW_HAL_SUCCESS;
1731}
1732
1733
1734/**
1735 * @brief network sdk deinit
1736 * @param
1737 * @retval 0: success
1738 * @retval other: fail
1739 */
1740int gsw_nw_sdk_deinit(void)
1741{
1742 int ret = -1;
1743
1744 if (nw_init_flag == 0 || nw_info_handle == NULL)
1745 {
xy.heb41615b2025-05-28 16:33:20 +08001746 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001747 }
1748
1749 ret = mbtk_info_handle_free(&nw_info_handle);
1750 if(ret != GSW_HAL_SUCCESS)
1751 {
1752 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001753 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001754 }
1755
1756 dlclose(dlHandle_mbtk);
1757 nw_info_handle = NULL;
1758 nw_init_flag = 0;
1759
1760 return GSW_HAL_SUCCESS;
1761
1762}
1763
1764
1765/**
1766 * @brief get current network reg info
1767 * @param [out] serving_info struct for network info
1768 * include regstate ps_state opreator name mcc mcn etc
1769 * @retval 0: success
1770 * @retval other: fail
1771 */
1772int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1773{
1774
1775 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001776 if (nw_init_flag == 0 || nw_info_handle == NULL)
1777 {
q.huang238b22a2025-06-10 14:36:59 +08001778 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001779 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001780 }
1781
1782 LOGE("mbtk_net_reg_get start \n");
1783 //regstate
1784 mbtk_net_reg_info_t reg;
1785 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1786 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1787 if(ret)
1788 {
1789 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001790 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001791 }
1792
1793 LOGE("convert_cs_reg_state\n");
1794 //cs_state
1795 serving_info->reg_state = convert_reg_state(reg.call_state);
1796 LOGE("convert_ps_reg_state\n");
1797 //ps_state
1798 serving_info->ps_state = convert_reg_state(reg.data_state);
1799 LOGE("convert_rat_mode\n");
1800 //reg_rat
1801 serving_info->reg_rat = convert_net_mode(reg.type);
1802 //srv_domain
1803 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1804 {
1805 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1806 {
1807 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1808 }
1809
1810 else
1811 {
1812 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1813 }
1814 }
1815
1816 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1817 {
1818 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1819 }
1820
1821 else
1822 {
1823 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1824 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1825 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1826 }
1827
1828 LOGD("roaming_ind\n");
1829 //roaming_ind
1830 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1831 {
1832 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1833 }
1834 else
1835 {
1836 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1837 }
1838
1839 LOGD("reject\n");
1840 //reject
1841 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1842 {
1843 LOGD("reject_callback\n");
1844 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1845 }
1846
1847 LOGD("reg_plmn / operator name\n");
1848 //reg_plmn / operator name
1849 mbtk_net_info_t net;
1850 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1851 LOGD("mbtk_net_sel_mode_get start \n");
1852 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1853 LOGD("mbtk_net_sel_mode_get end \n");
1854 if(ret == 0 && net.plmn > 0)
1855 {
1856 int i = 0;
1857
1858 LOGD("start to find mcc");
1859 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1860 {
1861 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1862 {
1863 LOGD("find mcc\n");
1864 break;
1865 }
1866 i++;
1867 }
1868
1869
1870 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1871 {
1872 LOGD("not find mcc");
1873 strcpy(serving_info->operator_name, "unknown");
hong.liud2417072025-06-27 07:10:37 -07001874 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001875 }
1876
1877 else
1878 {
1879 LOGD("find mcc\n");
1880 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
hong.liud2417072025-06-27 07:10:37 -07001881 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001882 }
1883
1884 LOGE("operator_name = %s\n", serving_info->operator_name);
1885 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1886 }
1887
1888
1889 LOGD("get cell id/tac/lac/sid/nid\n");
1890 //cell id/tac/lac/sid/nid
1891 mbtk_cell_type_enum cell_type;
b.liu68a94c92025-05-24 12:53:41 +08001892 list_node_t* cell_list = NULL;
1893
1894 LOGD("mbtk_cell_get start\n");
1895 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1896 if(ret != 0 || cell_list == NULL)
1897 {
1898 LOGE("mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001899 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001900 }
1901 else
1902 {
1903 LOGE("mbtk_cell_get end,start to get node\n");
1904 list_first(cell_list);
1905 LOGE("list_first end\n");
1906 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1907 if(cell)
1908 {
1909 LOGE("cell is not null,value2 = %u\n",cell->value2);
1910 switch(cell_type)
1911 {
1912 case MBTK_CELL_TYPE_LTE:
1913 {
1914 LOGE("is lte\n");
1915 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1916 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
hong.liud2417072025-06-27 07:10:37 -07001917 snprintf(serving_info->tac,sizeof(serving_info->tac),"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001918 strcpy(serving_info->lac,"");
hong.liud2417072025-06-27 07:10:37 -07001919 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%u",cell->value10);
b.liu68a94c92025-05-24 12:53:41 +08001920 break;
1921 }
1922
1923 case MBTK_CELL_TYPE_GSM:
1924 {
1925 LOGE("is gsm\n");
1926 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
hong.liud2417072025-06-27 07:10:37 -07001927 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001928 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001929 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001930 break;
1931 }
1932 case MBTK_CELL_TYPE_UMTS:
1933 {
1934 LOGE("is wcdma\n");
1935 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
hong.liud2417072025-06-27 07:10:37 -07001936 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001937 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001938 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001939 break;
1940 }
1941
1942 default:
1943 break;
1944 }
1945 }
1946 else
1947 {
1948 LOGE("cell is null\n");
1949 }
1950 }
1951
1952 //not support now
1953 serving_info->sid = 0;
1954 serving_info->nid = 0;
1955
1956 return GSW_HAL_SUCCESS;
1957}
1958
1959
1960/**
1961 * @brief get current network type
1962 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1963 * @retval 0: success
1964 * @retval other: fail
1965 */
hong.liud2417072025-06-27 07:10:37 -07001966int gsw_get_netype(int32_t *netype)
b.liu68a94c92025-05-24 12:53:41 +08001967{
1968 int ret = -1;
1969
1970 if (nw_init_flag == 0 || nw_info_handle == NULL)
1971 {
xy.heb41615b2025-05-28 16:33:20 +08001972 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001973 }
1974
1975 //regstate
1976 mbtk_net_reg_info_t reg;
1977 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1978 if(ret)
1979 {
1980 LOGE("mbtk_net_reg_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 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1985 {
1986 *netype = convert_net_mode(reg.type);
1987 }
1988 else
1989 {
1990 *netype = GSW_NETWORK_RADIO_NO_SVC;
1991 }
1992
1993 return GSW_HAL_SUCCESS;
1994}
1995
1996
1997/**
1998 * @brief get radio opmode, as open and close airplane mode
1999 * @param [out] op_mode 1 is radio on, 0 is radio off
2000 * @retval 0: success
2001 * @retval other: fail
2002 */
2003int gsw_get_opmode(int *op_mode)
2004{
2005 int tmp_rf = -1;
2006 int ret = -1;
2007 if (nw_init_flag == 0 || nw_info_handle == NULL)
2008 {
xy.heb41615b2025-05-28 16:33:20 +08002009 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002010 }
2011
2012 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
2013 if (ret != 0)
2014 {
2015 LOGE("mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002016 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002017 }
2018 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
2019 {
2020 *op_mode = GSW_OP_MODE_LPM;
2021 }
2022
2023 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
2024 {
2025 *op_mode = GSW_OP_MODE_OFFLINE;
2026 }
2027
2028 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
2029 {
2030 *op_mode = GSW_OP_MODE_ONLINE;
2031 }
2032
2033 return GSW_HAL_SUCCESS;
2034}
2035
2036
2037
2038/**
2039 * @brief set radio opmode, as open and close airplane mode
2040 * @param [in] op_mode 1 is radio on, 0 is radio off
2041 * @retval 0: success
2042 * @retval other: fail
2043 */
hong.liud2417072025-06-27 07:10:37 -07002044int gsw_set_opmode(int32_t op_mode)
b.liu68a94c92025-05-24 12:53:41 +08002045{
2046 mbtk_modem_info_t info;
2047 int rf_mode = -1;
2048 int ret = -1;
2049
2050 if (nw_init_flag == 0 || nw_info_handle == NULL)
2051 {
xy.heb41615b2025-05-28 16:33:20 +08002052 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002053 }
2054
2055 if(op_mode == GSW_OP_MODE_LPM)
2056 {
2057 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
2058 }
2059
2060 if(op_mode == GSW_OP_MODE_ONLINE)
2061 {
2062 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
2063 }
2064
2065 if(op_mode == GSW_OP_MODE_OFFLINE)
2066 {
2067 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
2068 }
2069
2070 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
2071 {
2072 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002073 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002074 }
2075
2076 info.fun = rf_mode;
2077 info.rst = 0;
2078 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2079 if (ret != 0)
2080 {
2081 LOGE("gsw_set_opmode 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 * @brief get network mode preference of mdm search network scale
2092 * @param [out] mode_pref net_work pref mode:
2093 * enum prefer_mode
2094 * @retval 0: success
2095 * @retval other: fail
2096 */
hong.liud2417072025-06-27 07:10:37 -07002097int gsw_get_mode_preference(int32_t *mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002098{
2099 if (nw_init_flag == 0 || nw_info_handle == NULL)
2100 {
xy.heb41615b2025-05-28 16:33:20 +08002101 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002102 }
2103
2104 int ret = -1;
2105 mbtk_band_info_t band;
2106 memset(&band, 0, sizeof(mbtk_band_info_t));
2107
2108 ret = mbtk_current_band_get(nw_info_handle, &band);
2109 if(ret != 0)
2110 {
2111 LOGE("mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002112 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002113 }
2114
2115 *mode_pref = convert_gsw_net_config(band.net_pref);
2116 LOGE("band.net_pref = %d\n", *mode_pref);
2117 if(*mode_pref <= 0)
2118 {
2119 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002120 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002121 }
2122 return GSW_HAL_SUCCESS;
2123
2124
2125}
2126
2127/**
2128 * @brief set network mode preference of mdm search network scale
2129 * @param [in] mode_pref net_work pref mode:
2130 * enum prefer_mode
2131 * @retval 0: success
2132 * @retval other: fail
2133 */
hong.liud2417072025-06-27 07:10:37 -07002134int gsw_set_mode_preference(int32_t mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002135{
2136 if (nw_init_flag == 0 || nw_info_handle == NULL)
2137 {
xy.heb41615b2025-05-28 16:33:20 +08002138 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002139 }
2140
2141 int ret = -1;
2142
2143 mbtk_band_info_t band;
2144 memset(&band, 0, sizeof(mbtk_band_info_t));
2145
2146 band.net_pref = convert_mbtk_net_config(mode_pref);
2147 LOGE("band.net_pref = %d\n", band.net_pref);
2148
2149 if(band.net_pref < 0)
2150 {
2151 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002152 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002153 }
2154
2155 ret = mbtk_current_band_set(nw_info_handle, &band);
2156 if(ret != 0)
2157 {
2158 LOGE("mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002159 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002160 }
2161
2162 return GSW_HAL_SUCCESS;
2163}
2164
2165/**
2166 * @brief get signal csq value
2167 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
2168 * @retval 0: success
2169 * @retval other: fail
2170 */
hong.liud2417072025-06-27 07:10:37 -07002171int gsw_get_sig_info(int32_t *csq_value)
b.liu68a94c92025-05-24 12:53:41 +08002172{
b.liu68a94c92025-05-24 12:53:41 +08002173 if (nw_init_flag == 0 || nw_info_handle == NULL)
2174 {
xy.heb41615b2025-05-28 16:33:20 +08002175 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002176 }
2177
q.huangdaa16d42025-07-03 14:32:48 +08002178 mbtk_signal_info_t signal;
q.huangfa0a0a32025-06-12 17:07:23 +08002179 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08002180 if(ret != 0)
2181 {
2182 LOGE("mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002183 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002184 }
2185
2186 LOGD("signal.type=%d\n", signal.type);
2187 switch(signal.type)
2188 {
q.huangfa0a0a32025-06-12 17:07:23 +08002189
b.liu68a94c92025-05-24 12:53:41 +08002190 case MBTK_RADIO_TECH_E_UTRAN:
2191 {
q.huangfa0a0a32025-06-12 17:07:23 +08002192 LOGD("lte rsrp = %d dbm",signal.rsrp-141);
2193 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08002194 break;
2195 }
2196 case MBTK_RADIO_TECH_UTRAN:
2197 case MBTK_RADIO_TECH_UTRAN_HSDPA:
2198 case MBTK_RADIO_TECH_UTRAN_HSUPA:
2199 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
2200 case MBTK_RADIO_TECH_UTRAN_HSPA:
2201 {
q.huangfa0a0a32025-06-12 17:07:23 +08002202 LOGD("w rscp = %d dbm",signal.rscp-121);
2203 *csq_value = rscpToLevel(signal.rscp-121);
2204 break;
2205 }
2206 case MBTK_RADIO_TECH_GSM:
2207 case MBTK_RADIO_TECH_GSM_COMPACT:
2208 case MBTK_RADIO_TECH_GSM_EGPRS:
2209 {
q.huang861c07d2025-06-24 16:54:58 +08002210 LOGD("gsm rxlev = %d (0-63)",signal.rxlev);
2211 *csq_value = rxlevToLevel(signal.rxlev);
b.liu68a94c92025-05-24 12:53:41 +08002212 break;
2213 }
2214 default:
2215 {
q.huangfa0a0a32025-06-12 17:07:23 +08002216 LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08002217 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002218 }
2219 }
2220 return GSW_HAL_SUCCESS;
2221}
2222
2223/**
2224 * @brief set nework power mode, for tcam enter standby or exit standby
2225 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
2226 * @retval 0: success
2227 * @retval other: fail
2228 */
2229int gsw_network_set_power_mode(char mode)
2230{
2231 int ret = -1;
2232
2233 if (nw_init_flag == 0 || nw_info_handle == NULL)
2234 {
xy.heb41615b2025-05-28 16:33:20 +08002235 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002236 }
2237
2238 if(mode != 0 && mode != 1)
2239 {
2240 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002241 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002242 }
2243
2244 if(mode == 1)
2245 {
2246 mode = 6;
2247 }
2248
2249 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
2250 if(ret != 0)
2251 {
2252 LOGE("mbtk_wakeup_state_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002253 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002254 }
2255
2256 return GSW_HAL_SUCCESS;
2257
2258
2259
2260}
2261
2262/**
2263 * @brief convert rsrp rscp rssi to csq value.
2264 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2265 * @param [in] sigvalue input signal_strength for different nettype
2266 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2267
2268 * @retval csq
2269 * @retval other: fail
2270 */
hong.liud2417072025-06-27 07:10:37 -07002271int gsw_sigInfo_to_csq(int32_t netType, int32_t sigValue)
b.liu68a94c92025-05-24 12:53:41 +08002272{
q.huang238b22a2025-06-10 14:36:59 +08002273 if (nw_init_flag == 0 || nw_info_handle == NULL)
2274 {
2275 return GSW_HAL_NORMAL_FAIL;
2276 }
b.liu68a94c92025-05-24 12:53:41 +08002277 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002278 {
2279 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002280 {
q.huangfa0a0a32025-06-12 17:07:23 +08002281 return rsrpToLevel(sigValue);
2282 }
2283 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002284 {
q.huangfa0a0a32025-06-12 17:07:23 +08002285 return rscpToLevel(sigValue);
2286 }
2287 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002288 {
q.huangfa0a0a32025-06-12 17:07:23 +08002289 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002290 }
2291
2292 default:
2293 {
2294 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002295 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002296 }
2297 }
2298}
2299
2300/*
2301 * @brief get mobile operator name
2302 @param [out] nw_operator_name_infos get the long and short operator name info
2303 @retval 0: success
2304 @retval 0: other: fail
2305 */
2306int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2307{
2308 char OperatorFN[128];
2309 char OperatorSH[128];
hong.liud2417072025-06-27 07:10:37 -07002310 char temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002311 mbtk_net_info_t net;
2312
2313 if (nw_init_flag == 0 || nw_info_handle == NULL)
2314 {
xy.heb41615b2025-05-28 16:33:20 +08002315 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002316 }
2317
2318 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2319 {
2320 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2321 int i = 0;
2322 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2323 {
2324 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2325 break;
2326 i++;
2327 }
2328
2329 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2330 {
2331 strcpy(OperatorFN, "UNKNOWN");
2332 strcpy(OperatorSH, "UNKNOWN");
2333 }
2334 else
2335 {
2336 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2337 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2338
q.huangdaa16d42025-07-03 14:32:48 +08002339
hong.liud2417072025-06-27 07:10:37 -07002340 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
b.liu68a94c92025-05-24 12:53:41 +08002341 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2342
q.huangdaa16d42025-07-03 14:32:48 +08002343
hong.liud2417072025-06-27 07:10:37 -07002344 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
b.liu68a94c92025-05-24 12:53:41 +08002345 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2346 }
2347
2348 memset(nw_operator_name_infos->long_eons,0,128);
2349 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2350 memset(nw_operator_name_infos->short_eons,0,128);
2351 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2352
2353 return GSW_HAL_SUCCESS;
2354 }
2355
2356 else
2357 {
2358 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002359 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002360 }
2361
2362 return GSW_HAL_SUCCESS;
2363}
2364
2365
2366/*
2367 * @brief get current serving cell info
2368 * @param cell_info: [out] struct for current cell info
2369 * include earfcn mcc mnc pci psc tac lac etc.
2370 * @return int: 0 is success, other failed
2371 */
2372int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2373{
b.liu68a94c92025-05-24 12:53:41 +08002374
2375 if (nw_init_flag == 0 || nw_info_handle == NULL)
2376 {
q.huang238b22a2025-06-10 14:36:59 +08002377 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002378 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002379 }
2380
2381 list_node_t* cell_list = NULL;
b.liu68a94c92025-05-24 12:53:41 +08002382 mbtk_cell_type_enum type;
q.huang638d5872025-06-21 13:44:43 +08002383 int ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
b.liu68a94c92025-05-24 12:53:41 +08002384 if(ret || cell_list == NULL) {
2385 LOGE("mbtk_cell_get failed : %d\n", ret);
q.huang638d5872025-06-21 13:44:43 +08002386 list_free(cell_list);
2387 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002388 } else {
q.huang638d5872025-06-21 13:44:43 +08002389 memset(cell_info,0,sizeof(GSW_NW_CELL_INFO));
b.liu68a94c92025-05-24 12:53:41 +08002390 list_first(cell_list);
2391 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2392 if(cell) { // Current server cell.
2393 switch(type)
2394 {
2395 case 0:
2396 {
2397 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
q.huangdaa16d42025-07-03 14:32:48 +08002398 char gsm_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002399
2400 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2401
2402 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002403 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002404 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2405
b.liu68a94c92025-05-24 12:53:41 +08002406 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002407 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value6);
b.liu68a94c92025-05-24 12:53:41 +08002408 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2409
2410 cell_info->cell_id_valid = 1;
2411 cell_info->cell_id = cell->value2;
2412
2413 cell_info->lac_valid = 1;
2414 cell_info->lac = cell->value1;
2415
2416 cell_info->arfcn_valid = 1;
2417 cell_info->arfcn = cell->value3;
q.huang861c07d2025-06-24 16:54:58 +08002418
2419 cell_info->rssi=rxlev_convert_to_rssi_dBm(cell->value7);
2420 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002421 break;
2422 }
2423
2424 case 1:
2425 {
2426 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
q.huangdaa16d42025-07-03 14:32:48 +08002427 char wcdma_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002428
2429 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2430
2431 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002432 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value4);
b.liu68a94c92025-05-24 12:53:41 +08002433 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2434
b.liu68a94c92025-05-24 12:53:41 +08002435 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002436 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002437 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2438
2439 cell_info->lac_valid = 1;
2440 cell_info->lac = cell->value1;
2441
2442 cell_info->cell_id_valid = 1;
2443 cell_info->cell_id = cell->value2;
2444
2445 cell_info->uarfcn_valid = 1;
2446 cell_info->uarfcn = cell->value3;
2447
2448 cell_info->psc_valid = 1;
2449 cell_info->psc = cell->value6;
2450 break;
2451 }
2452
2453 case 2:
2454 {
2455 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 +08002456
q.huangdaa16d42025-07-03 14:32:48 +08002457 char lte_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002458 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2459
2460 cell_info->mcc_valid = 1;
2461 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2462 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2463
b.liu68a94c92025-05-24 12:53:41 +08002464 cell_info->mnc_valid = 1;
2465 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2466 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2467
2468 cell_info->tac_valid = 1;
2469 cell_info->tac = cell->value1;
2470
2471 cell_info->pci_valid = 1;
2472 cell_info->pci = cell->value2;
2473
2474 cell_info->earfcn_valid = 1;
2475 cell_info->earfcn = cell->value3;
2476
2477 cell_info->bler_valid = 1;
2478 cell_info->bler = cell->value4;
2479
2480 cell_info->band_valid = 1;
2481 cell_info->band = cell->value5;
2482
q.huang638d5872025-06-21 13:44:43 +08002483 cell_info->rssnr = sinr_convert_to_10_times_dB(cell->value11);
2484 cell_info->rssnr_valid=(cell_info->rssnr!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002485
q.huang638d5872025-06-21 13:44:43 +08002486 cell_info->lteMode_valid = 1;
2487 cell_info->lteMode =(!(cell->value12));
2488
2489
2490 cell_info->rsrp = rsrp_convert_to_minus_dBm(cell->value8);
2491 cell_info->rsrp_valid = (cell_info->rsrp!=INT_32_MAX);
2492
2493 cell_info->rsrq = rsrq_convert_to_minus_dB(cell->value9);
2494 cell_info->rsrq_valid = (cell_info->rsrq!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002495
2496 cell_info->cell_id_valid = 1;
2497 cell_info->cell_id = cell->value10;
2498
q.huang638d5872025-06-21 13:44:43 +08002499 cell_info->rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->rsrp);
2500 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
2501
b.liu68a94c92025-05-24 12:53:41 +08002502 break;
2503 }
2504
2505 default:
2506 break;
2507 }
2508 }
q.huang638d5872025-06-21 13:44:43 +08002509 int neibor_count = 0;
b.liu68a94c92025-05-24 12:53:41 +08002510 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2511 {
2512 switch(type)
2513 {
2514 //GSM
2515 case 0:
2516 {
2517
2518 }
2519 //WCDMA
2520 case 1:
2521 {
2522 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2523
2524 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2525
2526 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2527 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2528
2529 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2530 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2531
2532 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2533
2534 neibor_count++;
2535
2536 }
2537 //LTE
2538 case 2:
2539 {
2540 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2541 char lte_temp[12] = {0};
2542 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2543
q.huangdaa16d42025-07-03 14:32:48 +08002544
b.liu68a94c92025-05-24 12:53:41 +08002545 cell_info->ext_info[neibor_count].pci = cell->value1;
2546 cell_info->ext_info[neibor_count].pci_valid = 1;
2547
2548 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2549 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2550
q.huang638d5872025-06-21 13:44:43 +08002551 cell_info->ext_info[neibor_count].rsrp = rsrp_convert_to_minus_dBm(cell->value3);
2552 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 +08002553
q.huang638d5872025-06-21 13:44:43 +08002554 cell_info->ext_info[neibor_count].rsrq = rsrq_convert_to_minus_dB(cell->value4);
2555 cell_info->ext_info[neibor_count].rsrq_valid = (cell_info->ext_info[neibor_count].rsrq!=INT_32_MAX);
2556
2557 if(cell->value7!=INT_32_MAX)
2558 {
2559 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2560 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2561
2562 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2563 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 +08002564
b.liu68a94c92025-05-24 12:53:41 +08002565
q.huang638d5872025-06-21 13:44:43 +08002566 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2567 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mnc));
2568
2569
2570 //value 8 is tac
b.liu68a94c92025-05-24 12:53:41 +08002571
q.huang638d5872025-06-21 13:44:43 +08002572 cell_info->ext_info[neibor_count].band = cell->value9;
2573 cell_info->ext_info[neibor_count].band_valid = 1;
2574
2575 cell_info->ext_info[neibor_count].rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->ext_info[neibor_count].rsrp);
2576 cell_info->ext_info[neibor_count].rssi_valid = (cell_info->ext_info[neibor_count].rssi!=INT_32_MAX);
2577 }
b.liu68a94c92025-05-24 12:53:41 +08002578
2579 neibor_count++;
2580 }
2581
2582 default:
2583 break;
2584 }
2585 }
q.huang638d5872025-06-21 13:44:43 +08002586 cell_info->ext_info_len=neibor_count;
b.liu68a94c92025-05-24 12:53:41 +08002587 }
2588 list_free(cell_list);
2589
2590 return GSW_HAL_SUCCESS;
2591}
2592
2593/*
2594 * @brief set modem status event callback
2595 @param [in] handle_ptr callback function address
2596 @retval 0: success
2597 @retval 0: other: fail
2598 */
2599int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2600{
2601
2602 if (nw_init_flag == 0 || nw_info_handle == NULL)
2603 {
xy.heb41615b2025-05-28 16:33:20 +08002604 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002605 }
2606
b.liu68a94c92025-05-24 12:53:41 +08002607 if(handle_ptr == NULL)
2608 {
2609 LOGE("handle_ptr is NULL\n");
q.huang66b79162025-06-27 17:45:34 +08002610 modem_cb=NULL;
2611 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08002612 }
2613
2614 modem_cb = handle_ptr;
2615
b.liu68a94c92025-05-24 12:53:41 +08002616 return GSW_HAL_SUCCESS;
2617
2618}
2619
2620
2621/*
2622 * @brief get PLMNs from the FPLMN list
2623 * @param [inout] plmn_list:
2624 * @retval 0: success
2625 * @retval other: fail
2626 */
2627int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2628{
2629 if (nw_init_flag == 0 || nw_info_handle == NULL)
2630 {
xy.heb41615b2025-05-28 16:33:20 +08002631 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002632 }
2633
2634 int ret = -1;
2635 char fplmn[256] = {0};
2636 LOGE("mbtk_fplmn_get enter\n");
2637 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2638 LOGE("mbtk_fplmn_get exit\n");
2639 if(ret != 0)
2640 {
2641 LOGE("mbtk_fplmn_get 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 update_fplmn_list(fplmn);
2646 for(int i = 0; i < fplmn_index; i++)
2647 {
2648 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2649 {
2650 continue;
2651 }
2652 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);
2653 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);
2654 plmn_list->plmn_list_len++;
2655 }
2656
2657 LOGE("fplmn = %s\n", fplmn);
2658 return GSW_HAL_SUCCESS;
2659}
2660
2661/*
2662 * @brief add PLMNs from the plmn_list to the FPLMN list
2663 * @param [in] plmn_list:
2664 * @retval 0: success
2665 * @retval other: fail
2666 */
2667int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2668{
2669
2670 if (nw_init_flag == 0 || nw_info_handle == NULL)
2671 {
xy.heb41615b2025-05-28 16:33:20 +08002672 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002673 }
2674
2675 if(plmn_list->plmn_list_len >= fplmn_max_length)
2676 {
2677 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002678 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002679 }
2680
2681 int i = 0;
2682 int index = -1;
2683
2684 for(i = 0; i < plmn_list->plmn_list_len; i++)
2685 {
2686 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2687
2688 if(index == -1)
2689 {
2690 LOGE("no this PLMN, add it\n");
2691 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2692 {
2693 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002694 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002695 }
2696
2697 else
2698 {
2699 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2700 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2701 fplmn_array[fplmn_index][5] = '\0';
2702 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2703 fplmn_index++;
2704 }
2705 }
2706
2707 else
2708 {
2709 LOGE("already have this PLMN, don't add it\n");
2710 }
2711 }
2712
2713 char fplmn_str[256] = {0};
2714 convert_plmn_to_fplmn_str(fplmn_str);
2715
2716 LOGE("fplmn_str = %s\n", fplmn_str);
2717
2718 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2719 if(ret != 0)
2720 {
2721 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002722 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002723 }
2724
2725 LOGE("gsw_add_forbidden_networks exit\n");
2726 return GSW_HAL_SUCCESS;
2727}
2728
2729/*
2730 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2731 * @param [in] plmn_list:
2732 * @retval 0: success
2733 * @retval other: fail
2734 */
2735int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2736{
b.liu68a94c92025-05-24 12:53:41 +08002737 if (nw_init_flag == 0 || nw_info_handle == NULL)
2738 {
q.huangfa0a0a32025-06-12 17:07:23 +08002739 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002740 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002741 }
2742
2743 int i = 0;
2744 int index = -1;
2745
2746 for(i = 0; i < plmn_list->plmn_list_len; i++)
2747 {
2748 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2749 if(index != -1)
2750 {
2751 remove_fplmn(index);
2752 }
2753 else
2754 {
2755 LOGE("no this PLMN, can't remove it\n");
2756 }
2757 }
2758
2759 for(i = 0; i < fplmn_index; i++)
2760 {
2761 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2762 }
2763
2764 char fplmn_str[256] = {0};
2765 convert_plmn_to_fplmn_str(fplmn_str);
2766 LOGE("fplmn_str = %s\n", fplmn_str);
2767
2768 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2769 if(ret != 0)
2770 {
2771 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002772 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002773 }
2774
2775 LOGE("gsw_remove_forbidden_networks exit\n");
2776 return GSW_HAL_SUCCESS;
2777}
2778
2779/*
2780 * @brief clear FPLMN list
2781 * @param
2782 * @retval 0: success
2783 * @retval other: fail
2784 */
2785int gsw_clear_forbidden_networks(void)
2786{
2787 if (nw_init_flag == 0 || nw_info_handle == NULL)
2788 {
xy.heb41615b2025-05-28 16:33:20 +08002789 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002790 }
2791
2792 char fplmn_str[FPLMN_STRING_LENGTH+1];
2793 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2794 fplmn_str[(6 * fplmn_max_length)] = '\0';
2795
2796 LOGE("%s\n", fplmn_str);
2797 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2798 if(ret != 0)
2799 {
2800 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002801 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002802 }
2803
2804 return GSW_HAL_SUCCESS;
2805}
2806
2807/*
2808 * @brief get oos config
2809 * @param [in] oos_config
2810 * @retval 0: success
2811 * @retval other: fail
2812 */
2813int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2814{
2815 if (nw_init_flag == 0 || nw_info_handle == NULL)
2816 {
xy.heb41615b2025-05-28 16:33:20 +08002817 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002818 }
2819
2820 if(pt_info == NULL)
2821 {
2822 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002823 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002824 }
2825
2826 int ret = -1;
2827
2828 mbtk_oos_info oos_info;
2829 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2830
2831 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2832 if(ret != 0)
2833 {
2834 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002835 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002836 }
2837
2838 if(oos_info.mode == 0)
2839 {
2840 pt_info->t_min = 0;
2841 pt_info->t_step = 0;
2842 pt_info->t_max = 0;
2843 }
2844
2845 else
2846 {
2847 pt_info->t_min = (int)oos_info.oosPhase[0];
2848 pt_info->t_step = (int)oos_info.oosPhase[1];
2849 pt_info->t_max = (int)oos_info.oosPhase[2];
2850 }
2851
2852 return GSW_HAL_SUCCESS;
2853}
2854
2855
2856/*
2857 * @brief set oos config
2858 * @param [in] oos_config
2859 * @retval 0: success
2860 * @retval other: fail
2861 */
2862int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2863{
2864 if (nw_init_flag == 0 || nw_info_handle == NULL)
2865 {
xy.heb41615b2025-05-28 16:33:20 +08002866 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002867 }
2868
2869 if(pt_info == NULL)
2870 {
2871 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002872 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002873 }
2874
2875 int ret = -1;
2876 mbtk_oos_info oos_info;
2877 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2878
2879 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2880 {
2881 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002882 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002883 }
2884 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2885 {
2886 oos_info.mode = 1;
2887 oos_info.oosPhase[0] = pt_info->t_min;
2888 }
2889 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)
2890 {
2891 oos_info.mode = 1;
2892 oos_info.oosPhase[0] = pt_info->t_min;
2893 oos_info.oosPhase[1] = pt_info->t_step;
2894 }
2895 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))
2896 {
2897 oos_info.mode = 1;
2898 oos_info.oosPhase[0] = pt_info->t_min;
2899 oos_info.oosPhase[1] = pt_info->t_step;
2900 oos_info.oosPhase[2] = pt_info->t_max;
2901 }
2902 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2903 {
2904 oos_info.mode = 0;
2905 }
2906 else
2907 {
2908 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002909 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002910 }
2911
2912 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2913 if(ret != 0)
2914 {
2915 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002916 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002917 }
2918
2919 return GSW_HAL_SUCCESS;
2920}
2921
q.huang238b22a2025-06-10 14:36:59 +08002922/**
2923 * @brief get imei function
2924 * @param [in] len imei length,max is 20
2925 * @param [out] imei return imei from this func
2926 * @retval 0: success
2927 * @retval other: fail
2928 */
2929int gsw_get_imei(int len, char *imei)
2930{
q.huang238b22a2025-06-10 14:36:59 +08002931 if (nw_init_flag == 0 || nw_info_handle == NULL)
2932 {
2933 printf("nw sdk has been deinit\n");
2934 return GSW_HAL_NORMAL_FAIL;
2935 }
2936
2937 if(imei == NULL)
2938 {
2939 LOGE("imei is NULL.");
2940 return GSW_HAL_ARG_INVALID;
2941 }
2942
2943 if(len < GSW_IMEI_LENGTH)
2944 {
2945 LOGE("imei len is too short,len = %d\n", len);
2946 return GSW_HAL_NORMAL_FAIL;
2947 }
2948
q.huang861c07d2025-06-24 16:54:58 +08002949 int ret = mbtk_imei_get(nw_info_handle, (void *)imei);
q.huang238b22a2025-06-10 14:36:59 +08002950 if(ret != MBTK_ERR_OK)
2951 {
2952 LOGE("[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
2953 return GSW_HAL_NORMAL_FAIL;
2954 }
2955
2956 return GSW_HAL_SUCCESS;
2957}
2958
2959/**
2960 * @brief reset modem stack only, notice: after use this method, all ril sdk
2961 * need restart by app, means network, sim, sms, data need deinit then init!
2962 * @param
2963 * @retval 0: success
2964 * @retval other: fail
2965 */
2966int gsw_reset_modem(void)
2967{
2968 int ret = -1;
2969 if (nw_init_flag == 0 || nw_info_handle == NULL)
2970 {
2971 printf("nw sdk has been deinit\n");
2972 return GSW_HAL_NORMAL_FAIL;
2973 }
2974 mbtk_modem_info_t info;
2975 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2976 info.rst = 0;
2977
2978 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2979 if(ret)
2980 {
2981 LOGE("[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
2982 return GSW_HAL_NORMAL_FAIL;
2983 }
2984
2985 sleep(1);
2986
2987 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2988 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2989 if(ret)
2990 {
2991 LOGE("[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
2992 return GSW_HAL_NORMAL_FAIL;
2993 }
2994 return GSW_HAL_SUCCESS;
2995}
b.liu68a94c92025-05-24 12:53:41 +08002996
q.huangc8b93122025-06-17 17:46:05 +08002997int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2998{
2999 if (nw_init_flag == 0 || nw_info_handle == NULL)
3000 {
3001 return GSW_HAL_NORMAL_FAIL;
3002 }
3003
3004 if(handle_ptr == NULL)
3005 {
3006 LOGE("handle_ptr is NULL\n");
3007 return GSW_HAL_NORMAL_FAIL;
3008 }
3009
3010 airplane_cb = handle_ptr;
3011
3012 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_operating_mode_event_callback);
3013 if(ret != 0)
3014 {
3015 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
3016 airplane_cb=NULL;
3017 return GSW_HAL_NORMAL_FAIL;
3018 }
3019
3020 return GSW_HAL_SUCCESS;
3021
3022}
3023
hong.liud2417072025-06-27 07:10:37 -07003024int gsw_get_apn_reserved_id(const char *apn)
3025{
3026 return 0;
3027}
3028
3029int gsw_set_apn_reserved_id(int reserved_id, const char *apn)
3030{
3031 return 0;
3032}
3033
3034int gsw_data_call_clear_session(int linkid, Link_Info_s *LinkInf)
3035{
3036 return 0;
3037}
3038
3039void *gsw_onUnsolicited(void *arg)
3040{
3041 return 0;
3042}
3043
3044int gsw_sdk_init(void)
3045{
3046 return 0;
3047}
3048
3049int gsw_get_modem_state_exp(void)
3050{
3051 return 0;
3052}