blob: e59e24bd00dc77e8e686e3a5c8ed701f9a83b1dc [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/*
lichengzhang0ba58962025-07-15 17:39:03 +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
lichengzhang0ba58962025-07-15 17:39:03 +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
lichengzhang0ba58962025-07-15 17:39:03 +08001356{
q.huangfa0a0a32025-06-12 17:07:23 +080013570 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
13581 uint8 rssi; // 0: 113 dBm or less
lichengzhang0ba58962025-07-15 17:39:03 +08001359 // 1: 111 dBm
1360 // 2��30: 109��53 dBm
1361 // 31: 51 dBm or greater
1362 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080013632 uint8 rxlev;// 0:rssi < -110 dBm
lichengzhang0ba58962025-07-15 17:39:03 +08001364 // 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
q.huangfa0a0a32025-06-12 17:07:23 +080013713 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
lichengzhang0ba58962025-07-15 17:39:03 +08001372 // 99 not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080013734 uint8 rscp; // 0: rscp < -120 dBm
lichengzhang0ba58962025-07-15 17:39:03 +08001374 // 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
q.huangfa0a0a32025-06-12 17:07:23 +080013815 uint8 ecno; // 0: Ec/Io < -24 dB
lichengzhang0ba58962025-07-15 17:39:03 +08001382 // 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
q.huangfa0a0a32025-06-12 17:07:23 +080013896 uint8 rsrq; // 0: rsrq < -19.5 dB
lichengzhang0ba58962025-07-15 17:39:03 +08001390 // 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
q.huangfa0a0a32025-06-12 17:07:23 +080013977 uint8 rsrp; // 0: rsrp < -140 dBm
lichengzhang0ba58962025-07-15 17:39:03 +08001398 // 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
q.huangfa0a0a32025-06-12 17:07:23 +080014058 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
lichengzhang0ba58962025-07-15 17:39:03 +08001406 // 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
q.huangfa0a0a32025-06-12 17:07:23 +08001427} __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 */
lichengzhang0ba58962025-07-15 17:39:03 +08002229
2230int gsw_nw_power_mode = 0;
b.liu68a94c92025-05-24 12:53:41 +08002231int gsw_network_set_power_mode(char mode)
2232{
lichengzhang0ba58962025-07-15 17:39:03 +08002233 //int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08002234 if (nw_init_flag == 0 || nw_info_handle == NULL)
2235 {
xy.heb41615b2025-05-28 16:33:20 +08002236 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002237 }
2238
2239 if(mode != 0 && mode != 1)
2240 {
2241 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002242 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002243 }
2244
2245 if(mode == 1)
lichengzhang0ba58962025-07-15 17:39:03 +08002246 gsw_nw_power_mode = 3;
2247 else
2248 gsw_nw_power_mode = 1;
2249 LOGE("mode is %d\n",gsw_nw_power_mode);
2250 // ret = mbtk_wakeup_state_set(nw_info_handle, gsw_nw_power_mode);
2251 // if(ret != 0)
2252 // {
2253 // LOGE("mbtk_wakeup_state_set fail\n");
2254 // return GSW_HAL_NORMAL_FAIL;
2255 // }
b.liu68a94c92025-05-24 12:53:41 +08002256
2257 return GSW_HAL_SUCCESS;
2258
2259
2260
2261}
2262
2263/**
2264 * @brief convert rsrp rscp rssi to csq value.
2265 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2266 * @param [in] sigvalue input signal_strength for different nettype
2267 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2268
2269 * @retval csq
2270 * @retval other: fail
2271 */
hong.liud2417072025-06-27 07:10:37 -07002272int gsw_sigInfo_to_csq(int32_t netType, int32_t sigValue)
b.liu68a94c92025-05-24 12:53:41 +08002273{
q.huang238b22a2025-06-10 14:36:59 +08002274 if (nw_init_flag == 0 || nw_info_handle == NULL)
2275 {
2276 return GSW_HAL_NORMAL_FAIL;
2277 }
b.liu68a94c92025-05-24 12:53:41 +08002278 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002279 {
2280 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002281 {
q.huangfa0a0a32025-06-12 17:07:23 +08002282 return rsrpToLevel(sigValue);
2283 }
2284 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002285 {
q.huangfa0a0a32025-06-12 17:07:23 +08002286 return rscpToLevel(sigValue);
2287 }
2288 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002289 {
q.huangfa0a0a32025-06-12 17:07:23 +08002290 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002291 }
2292
2293 default:
2294 {
2295 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002296 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002297 }
2298 }
2299}
2300
2301/*
2302 * @brief get mobile operator name
2303 @param [out] nw_operator_name_infos get the long and short operator name info
2304 @retval 0: success
2305 @retval 0: other: fail
2306 */
2307int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2308{
2309 char OperatorFN[128];
2310 char OperatorSH[128];
hong.liud2417072025-06-27 07:10:37 -07002311 char temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002312 mbtk_net_info_t net;
2313
2314 if (nw_init_flag == 0 || nw_info_handle == NULL)
2315 {
xy.heb41615b2025-05-28 16:33:20 +08002316 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002317 }
2318
2319 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2320 {
2321 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2322 int i = 0;
2323 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2324 {
2325 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2326 break;
2327 i++;
2328 }
2329
2330 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2331 {
2332 strcpy(OperatorFN, "UNKNOWN");
2333 strcpy(OperatorSH, "UNKNOWN");
2334 }
2335 else
2336 {
2337 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2338 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2339
q.huangdaa16d42025-07-03 14:32:48 +08002340
hong.liud2417072025-06-27 07:10:37 -07002341 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
b.liu68a94c92025-05-24 12:53:41 +08002342 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2343
q.huangdaa16d42025-07-03 14:32:48 +08002344
hong.liud2417072025-06-27 07:10:37 -07002345 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
b.liu68a94c92025-05-24 12:53:41 +08002346 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2347 }
2348
2349 memset(nw_operator_name_infos->long_eons,0,128);
2350 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2351 memset(nw_operator_name_infos->short_eons,0,128);
2352 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2353
2354 return GSW_HAL_SUCCESS;
2355 }
2356
2357 else
2358 {
2359 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002360 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002361 }
2362
2363 return GSW_HAL_SUCCESS;
2364}
2365
2366
2367/*
2368 * @brief get current serving cell info
2369 * @param cell_info: [out] struct for current cell info
2370 * include earfcn mcc mnc pci psc tac lac etc.
2371 * @return int: 0 is success, other failed
2372 */
2373int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2374{
b.liu68a94c92025-05-24 12:53:41 +08002375
2376 if (nw_init_flag == 0 || nw_info_handle == NULL)
2377 {
q.huang238b22a2025-06-10 14:36:59 +08002378 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002379 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002380 }
2381
2382 list_node_t* cell_list = NULL;
b.liu68a94c92025-05-24 12:53:41 +08002383 mbtk_cell_type_enum type;
q.huang638d5872025-06-21 13:44:43 +08002384 int ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
b.liu68a94c92025-05-24 12:53:41 +08002385 if(ret || cell_list == NULL) {
2386 LOGE("mbtk_cell_get failed : %d\n", ret);
q.huang638d5872025-06-21 13:44:43 +08002387 list_free(cell_list);
2388 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002389 } else {
q.huang638d5872025-06-21 13:44:43 +08002390 memset(cell_info,0,sizeof(GSW_NW_CELL_INFO));
b.liu68a94c92025-05-24 12:53:41 +08002391 list_first(cell_list);
2392 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2393 if(cell) { // Current server cell.
2394 switch(type)
2395 {
2396 case 0:
2397 {
2398 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 +08002399 char gsm_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002400
2401 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2402
2403 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002404 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002405 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2406
b.liu68a94c92025-05-24 12:53:41 +08002407 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002408 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value6);
b.liu68a94c92025-05-24 12:53:41 +08002409 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2410
2411 cell_info->cell_id_valid = 1;
2412 cell_info->cell_id = cell->value2;
2413
2414 cell_info->lac_valid = 1;
2415 cell_info->lac = cell->value1;
2416
2417 cell_info->arfcn_valid = 1;
2418 cell_info->arfcn = cell->value3;
q.huang861c07d2025-06-24 16:54:58 +08002419
2420 cell_info->rssi=rxlev_convert_to_rssi_dBm(cell->value7);
2421 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002422 break;
2423 }
2424
2425 case 1:
2426 {
2427 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
q.huangdaa16d42025-07-03 14:32:48 +08002428 char wcdma_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002429
2430 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2431
2432 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002433 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value4);
b.liu68a94c92025-05-24 12:53:41 +08002434 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2435
b.liu68a94c92025-05-24 12:53:41 +08002436 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002437 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002438 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2439
2440 cell_info->lac_valid = 1;
2441 cell_info->lac = cell->value1;
2442
2443 cell_info->cell_id_valid = 1;
2444 cell_info->cell_id = cell->value2;
2445
2446 cell_info->uarfcn_valid = 1;
2447 cell_info->uarfcn = cell->value3;
2448
2449 cell_info->psc_valid = 1;
2450 cell_info->psc = cell->value6;
2451 break;
2452 }
2453
2454 case 2:
2455 {
2456 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 +08002457
q.huangdaa16d42025-07-03 14:32:48 +08002458 char lte_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002459 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2460
2461 cell_info->mcc_valid = 1;
2462 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2463 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2464
b.liu68a94c92025-05-24 12:53:41 +08002465 cell_info->mnc_valid = 1;
2466 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2467 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2468
2469 cell_info->tac_valid = 1;
2470 cell_info->tac = cell->value1;
2471
2472 cell_info->pci_valid = 1;
2473 cell_info->pci = cell->value2;
2474
2475 cell_info->earfcn_valid = 1;
2476 cell_info->earfcn = cell->value3;
2477
2478 cell_info->bler_valid = 1;
2479 cell_info->bler = cell->value4;
2480
2481 cell_info->band_valid = 1;
2482 cell_info->band = cell->value5;
2483
q.huang638d5872025-06-21 13:44:43 +08002484 cell_info->rssnr = sinr_convert_to_10_times_dB(cell->value11);
2485 cell_info->rssnr_valid=(cell_info->rssnr!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002486
q.huang638d5872025-06-21 13:44:43 +08002487 cell_info->lteMode_valid = 1;
2488 cell_info->lteMode =(!(cell->value12));
2489
2490
2491 cell_info->rsrp = rsrp_convert_to_minus_dBm(cell->value8);
2492 cell_info->rsrp_valid = (cell_info->rsrp!=INT_32_MAX);
2493
2494 cell_info->rsrq = rsrq_convert_to_minus_dB(cell->value9);
2495 cell_info->rsrq_valid = (cell_info->rsrq!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002496
2497 cell_info->cell_id_valid = 1;
2498 cell_info->cell_id = cell->value10;
2499
q.huang638d5872025-06-21 13:44:43 +08002500 cell_info->rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->rsrp);
2501 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
2502
b.liu68a94c92025-05-24 12:53:41 +08002503 break;
2504 }
2505
2506 default:
2507 break;
2508 }
2509 }
q.huang638d5872025-06-21 13:44:43 +08002510 int neibor_count = 0;
b.liu68a94c92025-05-24 12:53:41 +08002511 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2512 {
2513 switch(type)
2514 {
2515 //GSM
2516 case 0:
2517 {
2518
2519 }
2520 //WCDMA
2521 case 1:
2522 {
2523 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2524
2525 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2526
2527 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2528 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2529
2530 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2531 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2532
2533 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2534
2535 neibor_count++;
2536
2537 }
2538 //LTE
2539 case 2:
2540 {
2541 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2542 char lte_temp[12] = {0};
2543 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2544
q.huangdaa16d42025-07-03 14:32:48 +08002545
b.liu68a94c92025-05-24 12:53:41 +08002546 cell_info->ext_info[neibor_count].pci = cell->value1;
2547 cell_info->ext_info[neibor_count].pci_valid = 1;
2548
2549 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2550 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2551
q.huang638d5872025-06-21 13:44:43 +08002552 cell_info->ext_info[neibor_count].rsrp = rsrp_convert_to_minus_dBm(cell->value3);
2553 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 +08002554
q.huang638d5872025-06-21 13:44:43 +08002555 cell_info->ext_info[neibor_count].rsrq = rsrq_convert_to_minus_dB(cell->value4);
2556 cell_info->ext_info[neibor_count].rsrq_valid = (cell_info->ext_info[neibor_count].rsrq!=INT_32_MAX);
2557
2558 if(cell->value7!=INT_32_MAX)
2559 {
2560 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2561 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2562
2563 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2564 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 +08002565
b.liu68a94c92025-05-24 12:53:41 +08002566
q.huang638d5872025-06-21 13:44:43 +08002567 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2568 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mnc));
2569
2570
2571 //value 8 is tac
b.liu68a94c92025-05-24 12:53:41 +08002572
q.huang638d5872025-06-21 13:44:43 +08002573 cell_info->ext_info[neibor_count].band = cell->value9;
2574 cell_info->ext_info[neibor_count].band_valid = 1;
2575
2576 cell_info->ext_info[neibor_count].rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->ext_info[neibor_count].rsrp);
2577 cell_info->ext_info[neibor_count].rssi_valid = (cell_info->ext_info[neibor_count].rssi!=INT_32_MAX);
2578 }
b.liu68a94c92025-05-24 12:53:41 +08002579
2580 neibor_count++;
2581 }
2582
2583 default:
2584 break;
2585 }
2586 }
q.huang638d5872025-06-21 13:44:43 +08002587 cell_info->ext_info_len=neibor_count;
b.liu68a94c92025-05-24 12:53:41 +08002588 }
2589 list_free(cell_list);
2590
2591 return GSW_HAL_SUCCESS;
2592}
2593
2594/*
2595 * @brief set modem status event callback
2596 @param [in] handle_ptr callback function address
2597 @retval 0: success
2598 @retval 0: other: fail
2599 */
2600int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2601{
2602
2603 if (nw_init_flag == 0 || nw_info_handle == NULL)
2604 {
xy.heb41615b2025-05-28 16:33:20 +08002605 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002606 }
2607
b.liu68a94c92025-05-24 12:53:41 +08002608 if(handle_ptr == NULL)
2609 {
2610 LOGE("handle_ptr is NULL\n");
q.huang66b79162025-06-27 17:45:34 +08002611 modem_cb=NULL;
2612 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08002613 }
2614
2615 modem_cb = handle_ptr;
2616
b.liu68a94c92025-05-24 12:53:41 +08002617 return GSW_HAL_SUCCESS;
2618
2619}
2620
2621
2622/*
2623 * @brief get PLMNs from the FPLMN list
2624 * @param [inout] plmn_list:
2625 * @retval 0: success
2626 * @retval other: fail
2627 */
2628int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2629{
2630 if (nw_init_flag == 0 || nw_info_handle == NULL)
2631 {
xy.heb41615b2025-05-28 16:33:20 +08002632 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002633 }
2634
2635 int ret = -1;
2636 char fplmn[256] = {0};
2637 LOGE("mbtk_fplmn_get enter\n");
2638 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2639 LOGE("mbtk_fplmn_get exit\n");
2640 if(ret != 0)
2641 {
2642 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002643 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002644 }
2645
2646 update_fplmn_list(fplmn);
2647 for(int i = 0; i < fplmn_index; i++)
2648 {
2649 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2650 {
2651 continue;
2652 }
2653 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);
2654 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);
2655 plmn_list->plmn_list_len++;
2656 }
2657
2658 LOGE("fplmn = %s\n", fplmn);
2659 return GSW_HAL_SUCCESS;
2660}
2661
2662/*
2663 * @brief add PLMNs from the plmn_list to the FPLMN list
2664 * @param [in] plmn_list:
2665 * @retval 0: success
2666 * @retval other: fail
2667 */
2668int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2669{
2670
2671 if (nw_init_flag == 0 || nw_info_handle == NULL)
2672 {
xy.heb41615b2025-05-28 16:33:20 +08002673 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002674 }
2675
2676 if(plmn_list->plmn_list_len >= fplmn_max_length)
2677 {
2678 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002679 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002680 }
2681
2682 int i = 0;
2683 int index = -1;
2684
2685 for(i = 0; i < plmn_list->plmn_list_len; i++)
2686 {
2687 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2688
2689 if(index == -1)
2690 {
2691 LOGE("no this PLMN, add it\n");
2692 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2693 {
2694 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002695 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002696 }
2697
2698 else
2699 {
2700 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2701 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2702 fplmn_array[fplmn_index][5] = '\0';
2703 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2704 fplmn_index++;
2705 }
2706 }
2707
2708 else
2709 {
2710 LOGE("already have this PLMN, don't add it\n");
2711 }
2712 }
2713
2714 char fplmn_str[256] = {0};
2715 convert_plmn_to_fplmn_str(fplmn_str);
2716
2717 LOGE("fplmn_str = %s\n", fplmn_str);
2718
2719 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2720 if(ret != 0)
2721 {
2722 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002723 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002724 }
2725
2726 LOGE("gsw_add_forbidden_networks exit\n");
2727 return GSW_HAL_SUCCESS;
2728}
2729
2730/*
2731 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2732 * @param [in] plmn_list:
2733 * @retval 0: success
2734 * @retval other: fail
2735 */
2736int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2737{
b.liu68a94c92025-05-24 12:53:41 +08002738 if (nw_init_flag == 0 || nw_info_handle == NULL)
2739 {
q.huangfa0a0a32025-06-12 17:07:23 +08002740 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002741 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002742 }
2743
2744 int i = 0;
2745 int index = -1;
2746
2747 for(i = 0; i < plmn_list->plmn_list_len; i++)
2748 {
2749 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2750 if(index != -1)
2751 {
2752 remove_fplmn(index);
2753 }
2754 else
2755 {
2756 LOGE("no this PLMN, can't remove it\n");
2757 }
2758 }
2759
2760 for(i = 0; i < fplmn_index; i++)
2761 {
2762 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2763 }
2764
2765 char fplmn_str[256] = {0};
2766 convert_plmn_to_fplmn_str(fplmn_str);
2767 LOGE("fplmn_str = %s\n", fplmn_str);
2768
2769 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2770 if(ret != 0)
2771 {
2772 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002773 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002774 }
2775
2776 LOGE("gsw_remove_forbidden_networks exit\n");
2777 return GSW_HAL_SUCCESS;
2778}
2779
2780/*
2781 * @brief clear FPLMN list
2782 * @param
2783 * @retval 0: success
2784 * @retval other: fail
2785 */
2786int gsw_clear_forbidden_networks(void)
2787{
2788 if (nw_init_flag == 0 || nw_info_handle == NULL)
2789 {
xy.heb41615b2025-05-28 16:33:20 +08002790 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002791 }
2792
2793 char fplmn_str[FPLMN_STRING_LENGTH+1];
2794 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2795 fplmn_str[(6 * fplmn_max_length)] = '\0';
2796
2797 LOGE("%s\n", fplmn_str);
2798 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2799 if(ret != 0)
2800 {
2801 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002802 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002803 }
2804
2805 return GSW_HAL_SUCCESS;
2806}
2807
2808/*
2809 * @brief get oos config
2810 * @param [in] oos_config
2811 * @retval 0: success
2812 * @retval other: fail
2813 */
2814int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2815{
2816 if (nw_init_flag == 0 || nw_info_handle == NULL)
2817 {
xy.heb41615b2025-05-28 16:33:20 +08002818 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002819 }
2820
2821 if(pt_info == NULL)
2822 {
2823 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002824 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002825 }
2826
2827 int ret = -1;
2828
2829 mbtk_oos_info oos_info;
2830 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2831
2832 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2833 if(ret != 0)
2834 {
2835 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002836 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002837 }
2838
2839 if(oos_info.mode == 0)
2840 {
2841 pt_info->t_min = 0;
2842 pt_info->t_step = 0;
2843 pt_info->t_max = 0;
2844 }
2845
2846 else
2847 {
2848 pt_info->t_min = (int)oos_info.oosPhase[0];
2849 pt_info->t_step = (int)oos_info.oosPhase[1];
2850 pt_info->t_max = (int)oos_info.oosPhase[2];
2851 }
2852
2853 return GSW_HAL_SUCCESS;
2854}
2855
2856
2857/*
2858 * @brief set oos config
2859 * @param [in] oos_config
2860 * @retval 0: success
2861 * @retval other: fail
2862 */
2863int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2864{
2865 if (nw_init_flag == 0 || nw_info_handle == NULL)
2866 {
xy.heb41615b2025-05-28 16:33:20 +08002867 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002868 }
2869
2870 if(pt_info == NULL)
2871 {
2872 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002873 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002874 }
2875
2876 int ret = -1;
2877 mbtk_oos_info oos_info;
2878 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2879
2880 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2881 {
2882 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002883 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002884 }
2885 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2886 {
2887 oos_info.mode = 1;
2888 oos_info.oosPhase[0] = pt_info->t_min;
2889 }
2890 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)
2891 {
2892 oos_info.mode = 1;
2893 oos_info.oosPhase[0] = pt_info->t_min;
2894 oos_info.oosPhase[1] = pt_info->t_step;
2895 }
2896 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))
2897 {
2898 oos_info.mode = 1;
2899 oos_info.oosPhase[0] = pt_info->t_min;
2900 oos_info.oosPhase[1] = pt_info->t_step;
2901 oos_info.oosPhase[2] = pt_info->t_max;
2902 }
2903 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2904 {
2905 oos_info.mode = 0;
2906 }
2907 else
2908 {
2909 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002910 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002911 }
2912
2913 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2914 if(ret != 0)
2915 {
2916 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002917 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002918 }
2919
2920 return GSW_HAL_SUCCESS;
2921}
2922
q.huang238b22a2025-06-10 14:36:59 +08002923/**
2924 * @brief get imei function
2925 * @param [in] len imei length,max is 20
2926 * @param [out] imei return imei from this func
2927 * @retval 0: success
2928 * @retval other: fail
2929 */
2930int gsw_get_imei(int len, char *imei)
2931{
q.huang238b22a2025-06-10 14:36:59 +08002932 if (nw_init_flag == 0 || nw_info_handle == NULL)
2933 {
2934 printf("nw sdk has been deinit\n");
2935 return GSW_HAL_NORMAL_FAIL;
2936 }
2937
2938 if(imei == NULL)
2939 {
2940 LOGE("imei is NULL.");
2941 return GSW_HAL_ARG_INVALID;
2942 }
2943
2944 if(len < GSW_IMEI_LENGTH)
2945 {
2946 LOGE("imei len is too short,len = %d\n", len);
2947 return GSW_HAL_NORMAL_FAIL;
2948 }
2949
q.huang861c07d2025-06-24 16:54:58 +08002950 int ret = mbtk_imei_get(nw_info_handle, (void *)imei);
q.huang238b22a2025-06-10 14:36:59 +08002951 if(ret != MBTK_ERR_OK)
2952 {
2953 LOGE("[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
2954 return GSW_HAL_NORMAL_FAIL;
2955 }
2956
2957 return GSW_HAL_SUCCESS;
2958}
2959
2960/**
2961 * @brief reset modem stack only, notice: after use this method, all ril sdk
2962 * need restart by app, means network, sim, sms, data need deinit then init!
2963 * @param
2964 * @retval 0: success
2965 * @retval other: fail
2966 */
2967int gsw_reset_modem(void)
2968{
2969 int ret = -1;
2970 if (nw_init_flag == 0 || nw_info_handle == NULL)
2971 {
2972 printf("nw sdk has been deinit\n");
2973 return GSW_HAL_NORMAL_FAIL;
2974 }
2975 mbtk_modem_info_t info;
2976 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2977 info.rst = 0;
2978
2979 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2980 if(ret)
2981 {
2982 LOGE("[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
2983 return GSW_HAL_NORMAL_FAIL;
2984 }
2985
2986 sleep(1);
2987
2988 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2989 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2990 if(ret)
2991 {
2992 LOGE("[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
2993 return GSW_HAL_NORMAL_FAIL;
2994 }
2995 return GSW_HAL_SUCCESS;
2996}
b.liu68a94c92025-05-24 12:53:41 +08002997
q.huangc8b93122025-06-17 17:46:05 +08002998int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2999{
3000 if (nw_init_flag == 0 || nw_info_handle == NULL)
3001 {
3002 return GSW_HAL_NORMAL_FAIL;
3003 }
3004
3005 if(handle_ptr == NULL)
3006 {
3007 LOGE("handle_ptr is NULL\n");
3008 return GSW_HAL_NORMAL_FAIL;
3009 }
3010
3011 airplane_cb = handle_ptr;
3012
3013 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_operating_mode_event_callback);
3014 if(ret != 0)
3015 {
3016 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
3017 airplane_cb=NULL;
3018 return GSW_HAL_NORMAL_FAIL;
3019 }
3020
3021 return GSW_HAL_SUCCESS;
3022
3023}
3024
hong.liud2417072025-06-27 07:10:37 -07003025int gsw_get_apn_reserved_id(const char *apn)
3026{
3027 return 0;
3028}
3029
3030int gsw_set_apn_reserved_id(int reserved_id, const char *apn)
3031{
3032 return 0;
3033}
3034
3035int gsw_data_call_clear_session(int linkid, Link_Info_s *LinkInf)
3036{
3037 return 0;
3038}
3039
3040void *gsw_onUnsolicited(void *arg)
3041{
3042 return 0;
3043}
3044
3045int gsw_sdk_init(void)
3046{
3047 return 0;
3048}
3049
3050int gsw_get_modem_state_exp(void)
3051{
3052 return 0;
3053}