blob: 7be4b2477884fbae08fe8d54d5b955dc6423a210 [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"
q.huang934ec0e2025-07-22 19:56:59 +08006#include "gsw_log_interface.h"
7
cz.lif4a9a932025-06-05 11:37:59 +08008#define SIG_TIMER 5
q.huang66b79162025-06-27 17:45:34 +08009#define MODEM_TIMER 5
q.huang934ec0e2025-07-22 19:56:59 +080010#define SERVING_TIMER 5
11
q.huang66b79162025-06-27 17:45:34 +080012
b.liu68a94c92025-05-24 12:53:41 +080013//mbtk include
14#define LYNQ_AIR_PLANE_MODE_OFF 1 //at+cfun = 1
15#define LYNQ_AIR_PLANE_MODE_ON 4 // at+cfun = 4
16#define LYNQ_AIR_CFUN_MODE_OFF 0 // at+cfun = 0
17
18#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
19
20#define FPLMN_STRING_LENGTH 120
21#define ENTRY_LENGTH 6
22#define FPLMN_ARRAY_SIZE (FPLMN_STRING_LENGTH / 6) + 1
23
q.huang238b22a2025-06-10 14:36:59 +080024#define MBTK_ERR_OK 0
xf.li56b78fb2025-06-13 03:29:21 -070025#define GSW_IMEI_LENGTH 15+1
q.huang238b22a2025-06-10 14:36:59 +080026
q.huangfa0a0a32025-06-12 17:07:23 +080027#define INT_32_MAX (0x7FFFFFFF)
28
q.huang238b22a2025-06-10 14:36:59 +080029
b.liu68a94c92025-05-24 12:53:41 +080030#ifndef FALSE
31#define FALSE (0)
32#endif
33
34
35#ifndef TRUE
36#define TRUE (!FALSE)
37#endif
38
39typedef unsigned int uint32;
40typedef unsigned char uint8;
q.huang861c07d2025-06-24 16:54:58 +080041typedef signed char int8;
b.liu68a94c92025-05-24 12:53:41 +080042typedef unsigned short uint16;
43typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
44
q.huangdaa16d42025-07-03 14:32:48 +080045//#define MBTK_READY_UCI "persist.mbtk.sdk.state"
46#define SDK_READY_CMD "uci get persist.mbtk.sdk__state"
q.huang66b79162025-06-27 17:45:34 +080047#define MBTK_READY_STRING_SIZE_MAX (3+1)
48
49
50typedef enum{
51 MBTK_READY_INIT = -1,
52 MBTK_READY_SUCCESS,
53 MBTK_READY_MODEM_FAIL,
54 MBTK_READY_RESPONSE_FAIL,
55 MBTK_READY_SOCKET_FAIL,
56 MBTK_READY_RIL_FAIL
57}mbtk_ready_status_type;
58
b.liu68a94c92025-05-24 12:53:41 +080059typedef enum
60{
61 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
62 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
63 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
64 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
65 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
66 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
67}MBTK_DEV_MODEM_FUNCTION;
68
69typedef enum
70{
71 MBTK_CELL_TYPE_GSM = 0,
72 MBTK_CELL_TYPE_UMTS,
73 MBTK_CELL_TYPE_LTE
74} mbtk_cell_type_enum;
75
76typedef struct
77{
78 MBTK_DEV_MODEM_FUNCTION fun;
79 int rst;
80} mbtk_modem_info_t;
81
82typedef struct
83{
84 int client_fd;
85 pthread_t read_thread_id;
86 int exit_fd[2];
87 bool is_waitting;
88 pthread_cond_t cond;
89 pthread_mutex_t mutex;
90
91 pthread_mutex_t send_mutex;
92
93 // Temp response data.
94 uint16 info_err;
95 uint16 data_len;
96 void *data;
97
98 //mbtk wyq for server_ready_status add start
99 char server_ready_status;
100 //mbtk wyq for server_ready_status add end
101
102 mbtk_info_callback_func net_state_cb;
103 mbtk_info_callback_func call_state_cb;
104 mbtk_info_callback_func sms_state_cb;
105 mbtk_info_callback_func radio_state_cb;
106 mbtk_info_callback_func sim_state_cb;
107 mbtk_info_callback_func pdp_state_cb;
108 //add signal by xr
109 mbtk_info_callback_func signal_state_cb;
110} mbtk_info_handle_t;
111
112
113
114typedef struct
115{
q.huang638d5872025-06-21 13:44:43 +0800116 // NR server cell:
117 // NR cell:
b.liu68a94c92025-05-24 12:53:41 +0800118 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
119 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
120 // WCDMA server cell: lac, ci, arfcn
121 // WCDMA cell: lac, ci, arfcn
122 // GSM server cell: lac, ci, arfcn, bsic
123 // GSM cell:
q.huang638d5872025-06-21 13:44:43 +0800124 uint32 value1; //tac
125 uint32 value2; //pci
126 uint32 value3; //dlEuarfcn
127 uint32 value4; //bler
128 uint32 value5; //band
129 uint32 value6; //mcc
130 uint32 value7; //mnc
131 uint32 value8; //rsrp
132 uint32 value9; //rsrq
133 uint32 value10; //cell identiy
134 uint32 value11; //sinr
135 uint32 value12; //is tdd
136 uint32 value13;
137 uint32 value14;
138 uint32 value15;
b.liu68a94c92025-05-24 12:53:41 +0800139} __attribute__((packed)) mbtk_cell_info_t;
140
b.liu68a94c92025-05-24 12:53:41 +0800141typedef struct
142{
143 uint8 net_pref; // mbtk_net_pref_enum
144 uint16 gsm_band; // mbtk_gsm_band_enum
145 uint16 umts_band; // mbtk_umts_band_enum
146 uint32 tdlte_band; // mbtk_tdlte_band_enum
147 uint32 fddlte_band; // mbtk_fddlte_band_enum
148 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
149} __attribute__((packed)) mbtk_band_info_t;
150
151typedef struct list_arraynode
152{
153 void *data;
154 struct list_arraynode *next;
155} list_arraynode_t;
156
157typedef struct list_treenode
158{
159 list_arraynode_t *data;
160 int count;
161 struct list_treenode *left;
162 struct list_treenode *right;
163} list_treenode_t;
164
165typedef int (*list_sort_func)(void *data1, void *data2);
166typedef void (*list_free_func)(void *data);
167
168typedef struct list_node
169{
170 uint32 size;
171 list_sort_func sort_func;
172 list_free_func free_func;
173
174 uint32 cur_index;
175 list_arraynode_t *cur_array_data;
176
177 list_arraynode_t array_data;
178 list_treenode_t tree_data;
179} list_node_t;
180
181/*
1820: GSM
1831: GSM Compact
1842: UTRAN
1853: GSM w/EGPRS
1864: UTRAN w/HSDPA
1875: UTRAN w/HSUPA
1886: UTRAN w/HSDPA and HSUPA
1897: E-UTRAN
1908: UTRAN HSPA+
191*/
192typedef enum {
193 MBTK_RADIO_TECH_GSM = 0,
194 MBTK_RADIO_TECH_GSM_COMPACT,
195 MBTK_RADIO_TECH_UTRAN,
196 MBTK_RADIO_TECH_GSM_EGPRS,
197 MBTK_RADIO_TECH_UTRAN_HSDPA,
198 MBTK_RADIO_TECH_UTRAN_HSUPA,
199 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
200 MBTK_RADIO_TECH_E_UTRAN, // LTE
201 MBTK_RADIO_TECH_UTRAN_HSPA
202} mbtk_radio_technology_enum;
203
204typedef struct
205{
206 /*
207 0: automatic
208 1: manual
209 */
210 uint8 net_sel_mode;
211 /*
212 0: GSM
213 1: GSM Compact
214 2: UTRAN
215 3: GSM w/EGPRS
216 4: UTRAN w/HSDPA
217 5: UTRAN w/HSUPA
218 6: UTRAN w/HSDPA and HSUPA
219 7: E-UTRAN
220 8: UTRAN HSPA+
221 0xFF: Unused
222 */
223 uint8 net_type;
224 //uint8 plmn[10]; // 46000
225 /*
226 0: unknown
227 1: available
228 2: current
229 3: forbidden
230 */
231 uint8 net_state;
232 uint32 plmn;
233} __attribute__((packed)) mbtk_net_info_t;
234
235
236typedef enum
237{
238 MBTK_NET_REG_STATE_NON = 0,
239 MBTK_NET_REG_STATE_HOME,
240 MBTK_NET_REG_STATE_SEARCHING,
241 MBTK_NET_REG_STATE_DENIED,
242 MBTK_NET_REG_STATE_UNKNOWN,
243 MBTK_NET_REG_STATE_ROAMING,
244 MBTK_NET_REG_STATE_SMS_ONLY,
245 MBTK_NET_REG_STATE_ROAMING_SMS,
246 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
247 MBTK_NET_REG_STATE_CSFB_HOME,
248 MBTK_NET_REG_STATE_CSFB_ROAMING,
249 MBTK_NET_REG_STATE_EMERGENCY_ONLY
250} mbtk_net_reg_state_enum;
251
252typedef struct
253{
254 uint8 call_state;// mbtk_net_reg_state_enum
255 uint8 data_state;// mbtk_net_reg_state_enum
256 uint8 ims_state;// mbtk_net_reg_state_enum
257 uint8 type; // mbtk_radio_technology_enum
258 uint16 lac;
259 uint32 ci;
260} __attribute__((packed)) mbtk_net_reg_info_t;
261
262typedef struct
263{
264 uint8 type; // mbtk_radio_technology_enum
265 uint8 rssi; // 0: 113 dBm or less
266 // 1: 111 dBm
267 // 2��30: 109��53 dBm
268 // 31: 51 dBm or greater
269 // 99: not known or not detectable
270 uint8 rxlev;// 0:rssi < -110 dBm
271 // 1: -110 dBm �� rssi < -109 dBm
272 // 2: -109 dBm �� rssi < -108 dBm
273 // ......
274 // 61: -50 dBm �� rssi < -49 dBm
275 // 62: -49 dBm �� rssi < -48 dBm
276 // 63: -48 dBm �� rssi
277 // 99: not known or not detectable
278 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
279 // 99 not known or not detectable
280 uint8 rscp; // 0: rscp < -120 dBm
281 // 1: -120 dBm �� rscp < -119 dBm
282 // 2: -119 dBm �� rscp < -118 dBm
283 // ......
284 // 94: -27 dBm �� rscp < -26 dBm
285 // 95: -26 dBm �� rscp < -25 dBm
286 // 96: - 25 dBm �� rscp
287 // 255: not known or not detectable
288 uint8 ecno; // 0: Ec/Io < -24 dB
289 // 1: -24 dB �� Ec/Io < -23.5 dB
290 // 2: -23.5 dB �� Ec/Io < -23 dB
291 // ......
292 // 47: -1 dB �� Ec/Io < -0.5 dB
293 // 48: -0.5 dB �� Ec/Io < 0 dB
294 // 49: 0 dB �� Ec/Io
295 // 255: not known or not detectable
296 uint8 rsrq; // 0: rsrq < -19.5 dB
297 // 1: -19.5 dB �� rsrq < -19 dB
298 // 2: -19 dB �� rsrq < -18.5 dB
299 // ......
300 // 32: -4 dB �� rsrq < -3.5 dB
301 // 33: -3.5 dB �� rsrq < -3 dB
302 // 34: -3 dB �� rsrq
303 // 255: not known or not detectable
304 uint8 rsrp; // 0: rsrp < -140 dBm
305 // 1: -140 dBm �� rsrp < -139 dBm
306 // 2: -139 dBm �� rsrp < -138 dBm
307 // ......
308 // 95: -46 dBm �� rsrp < -45 dBm
309 // 96: -45 dBm �� rsrp < -44 dBm
310 // 97: -44 dBm �� rsrp
311 // 255: not known or not detectable
q.huang861c07d2025-06-24 16:54:58 +0800312 int8 sinr; //-20-35 dbm
b.liu68a94c92025-05-24 12:53:41 +0800313} __attribute__((packed)) mbtk_signal_info_t;
314
315typedef struct{
316 uint8_t mode;
317 uint32_t oosPhase[3]; //单位为秒
318} mbtk_oos_info;
319
320typedef struct
321{
322 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
323 int t_min;
324 int t_step;
325 int t_max;
326}GSW_NW_OOS_CONFIG_INFO_T;
327
b.liu68a94c92025-05-24 12:53:41 +0800328#define lib_mbtk_path "/lib/libmbtk_lib.so"
329mbtk_info_handle_t* nw_info_handle = NULL;
330
q.huang638d5872025-06-21 13:44:43 +0800331static GSW_NW_ServingInfoHandlePtr serving_cb=NULL;
332static GSW_NW_SigInfoHandlePtr sig_cb=NULL;
333static GSW_NW_RejectCauseHandlePtr reject_cb=NULL;
334static GSW_NW_ModemStateHandlePtr modem_cb=NULL;
335static GSW_NW_AirplaneModeHandlePtr airplane_cb=NULL;
b.liu68a94c92025-05-24 12:53:41 +0800336
337static void *dlHandle_mbtk;
338int nw_init_flag = 0;
339int mode = -1;
340int fplmn_max_length = 0;
341
342gsw_nw_plmn_list_t gsw_nw_plmn_list;
343char fplmn_array[FPLMN_ARRAY_SIZE][7];
344int fplmn_index = 0;
345
346static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
347static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
348int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
349int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
350int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
351int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
352static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
353int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
354int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
355int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
356int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
357int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
358int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
359int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
360int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
361int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
362int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
363int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
q.huang238b22a2025-06-10 14:36:59 +0800364int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
q.huangdaa16d42025-07-03 14:32:48 +0800365bool (*str_empty)(const void *str);
q.huang238b22a2025-06-10 14:36:59 +0800366
b.liu68a94c92025-05-24 12:53:41 +0800367
l.yang6a42e4d2025-05-28 01:04:20 -0700368#define GSW_NW "[HAL][GSW_NW]"
369
b.liu68a94c92025-05-24 12:53:41 +0800370typedef struct
371{
372 char *lynq_operator_l;
373 char *lynq_operator_s;
374 uint32 lynq_mcc_mnc;
375} lynq_operator_mcc_mnc_t;
376
377static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
378{
379 {"China Mobile","CMCC",46000},
380 {"China Unicom","CU",46001},
381 {"China Mobile","CMCC",46002},
382 {"China Telecom","CT",46003},
383 {"China Mobile","CMCC",46004},
384 {"China Telecom","CT",46005},
385 {"China Unicom","CU",46006},
386 {"China Mobile","CMCC",46007},
387 {"China Mobile","CMCC",46008},
388 {"China Unicom","CU",46009},
389 {"China Telecom","CT",46011}
390};
391
392
393//GSW include
394typedef enum prefer_mode
395{
396 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
397 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
398 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
399 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
400 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
401 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
402 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
403 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
404} PREFER_MODE_E;
405
406static int mbtk_nw_api_import()
407{
408 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
409 if (dlHandle_mbtk == NULL)
410 {
xy.heb41615b2025-05-28 16:33:20 +0800411 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800412 }
q.huang934ec0e2025-07-22 19:56:59 +0800413
b.liu68a94c92025-05-24 12:53:41 +0800414 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
415 if (mbtk_info_handle_get == NULL)
416 {
q.huang934ec0e2025-07-22 19:56:59 +0800417 LOGE(GSW_NW,"mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800418 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800419 }
420
421 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
422 if (mbtk_info_handle_free == NULL)
423 {
q.huang934ec0e2025-07-22 19:56:59 +0800424 LOGE(GSW_NW,"mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800425 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800426 }
427
428 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
429 if (mbtk_net_sel_mode_get == NULL)
430 {
q.huang934ec0e2025-07-22 19:56:59 +0800431 LOGE(GSW_NW,"mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800432 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800433 }
434
435 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
436 if (mbtk_net_reg_get == NULL)
437 {
q.huang934ec0e2025-07-22 19:56:59 +0800438 LOGE(GSW_NW,"mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800439 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800440 }
441
442 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
443 if (mbtk_get_modem_fun == NULL)
444 {
q.huang934ec0e2025-07-22 19:56:59 +0800445 LOGE(GSW_NW,"mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800446 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800447 }
448
449 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
450 if (mbtk_set_modem_fun == NULL)
451 {
q.huang934ec0e2025-07-22 19:56:59 +0800452 LOGE(GSW_NW,"mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800453 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800454 }
455
456 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
457 if (mbtk_current_band_get == NULL)
458 {
q.huang934ec0e2025-07-22 19:56:59 +0800459 LOGE(GSW_NW,"mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800460 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800461 }
462
463 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
464 if (mbtk_current_band_set == NULL)
465 {
q.huang934ec0e2025-07-22 19:56:59 +0800466 LOGE(GSW_NW,"mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800467 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800468 }
469
470 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
471 if (mbtk_net_signal_get == NULL)
472 {
q.huang934ec0e2025-07-22 19:56:59 +0800473 LOGE(GSW_NW,"mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800474 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800475 }
476
477 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
478 if (mbtk_wakeup_state_set == NULL)
479 {
q.huang934ec0e2025-07-22 19:56:59 +0800480 LOGE(GSW_NW,"mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800481 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800482 }
483
484 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");
485 if (mbtk_cell_get == NULL)
486 {
q.huang934ec0e2025-07-22 19:56:59 +0800487 LOGE(GSW_NW,"mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800488 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800489 }
490
491 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");
492 if (mbtk_signal_state_change_cb_reg == NULL)
493 {
q.huang934ec0e2025-07-22 19:56:59 +0800494 LOGE(GSW_NW,"mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800495 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800496 }
497
498 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");
499 if (mbtk_net_state_change_cb_reg == NULL)
500 {
q.huang934ec0e2025-07-22 19:56:59 +0800501 LOGE(GSW_NW,"mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800502 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800503 }
504
505 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
506 if (mbtk_fplmn_get == NULL)
507 {
q.huang934ec0e2025-07-22 19:56:59 +0800508 LOGE(GSW_NW,"mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800509 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800510 }
511
512 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
513 if (mbtk_fplmn_set == NULL)
514 {
q.huang934ec0e2025-07-22 19:56:59 +0800515 LOGE(GSW_NW,"mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800516 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800517 }
518
519 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");
520 if (mbtk_radio_state_change_cb_reg == NULL)
521 {
q.huang934ec0e2025-07-22 19:56:59 +0800522 LOGE(GSW_NW,"mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800523 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800524 }
525
526 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
527 if (mbtk_oos_get == NULL)
528 {
q.huang934ec0e2025-07-22 19:56:59 +0800529 LOGE(GSW_NW,"mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800530 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800531 }
532
533 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
534 if (mbtk_oos_set == NULL)
535 {
q.huang934ec0e2025-07-22 19:56:59 +0800536 LOGE(GSW_NW,"mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800537 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800538 }
q.huang238b22a2025-06-10 14:36:59 +0800539
540 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
541 if (mbtk_imei_get == NULL)
542 {
q.huang934ec0e2025-07-22 19:56:59 +0800543 LOGE(GSW_NW,"mbtk_imei_get dlsym fail\n");
q.huang238b22a2025-06-10 14:36:59 +0800544 return GSW_HAL_NORMAL_FAIL;
545 }
q.huangdaa16d42025-07-03 14:32:48 +0800546
547 str_empty = (bool (*)(const void *str))dlsym(dlHandle_mbtk, "str_empty");
548 if (str_empty == NULL)
549 {
q.huang934ec0e2025-07-22 19:56:59 +0800550 LOGE(GSW_NW,"str_empty dlsym fail\n");
q.huangdaa16d42025-07-03 14:32:48 +0800551 return GSW_HAL_NORMAL_FAIL;
552 }
b.liu68a94c92025-05-24 12:53:41 +0800553
554 return GSW_HAL_SUCCESS;
555}
556
557void list_first(list_node_t *list)
558{
559 if (list) {
560 list->cur_index = 0;
561 list->cur_array_data = list->array_data.next;
562 }
563}
564
565void* list_next(list_node_t *list)
566{
567 if (list) {
568 list_arraynode_t *node = list->cur_array_data;
569 if (node) {
q.huang934ec0e2025-07-22 19:56:59 +0800570 LOGE(GSW_NW,"node is not null\n");
b.liu68a94c92025-05-24 12:53:41 +0800571 list->cur_array_data = list->cur_array_data->next;
572 list->cur_index++;
573 return node->data;
574 } else {
q.huang934ec0e2025-07-22 19:56:59 +0800575 LOGE(GSW_NW,"node is null\n");
b.liu68a94c92025-05-24 12:53:41 +0800576 return NULL;
577 }
578 } else {
q.huang934ec0e2025-07-22 19:56:59 +0800579 LOGE(GSW_NW,"list is null\n");
b.liu68a94c92025-05-24 12:53:41 +0800580 return NULL;
581 }
582}
583
584void list_free(list_node_t *list)
585{
586 if (list) {
587 list_arraynode_t *node = &(list->array_data); // Head node
588 list_arraynode_t *node_temp = NULL;
589 while (node->next) {
590 node_temp = node->next;
591 node->next = node->next->next;
592
593 if (list->free_func) {
594 list->free_func(node_temp->data);
595 } else {
596 free(node_temp->data);
597 }
598 free(node_temp);
599 }
600 free(list);
601 }
602}
603
q.huang861c07d2025-06-24 16:54:58 +0800604#if 0
q.huang638d5872025-06-21 13:44:43 +0800605static int32_t gsm_rssi_convert_to_dBm(uint8 rssi)
606{
607 if(rssi <= 31)
608 {
609 return rssi * 2 - 113; //0 map -113
610 //31 map -51
611 }
612 else
613 {
614 return INT_32_MAX;
615 }
616}
q.huang861c07d2025-06-24 16:54:58 +0800617#endif
q.huang638d5872025-06-21 13:44:43 +0800618
q.huangfa0a0a32025-06-12 17:07:23 +0800619static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
b.liu68a94c92025-05-24 12:53:41 +0800620{
q.huangfa0a0a32025-06-12 17:07:23 +0800621 if(rscp <= 96)
b.liu68a94c92025-05-24 12:53:41 +0800622 {
q.huangfa0a0a32025-06-12 17:07:23 +0800623 return 121-rscp; // 96 map 25
624 // 0 map -121, below -120
b.liu68a94c92025-05-24 12:53:41 +0800625 }
b.liu68a94c92025-05-24 12:53:41 +0800626 else
627 {
q.huangfa0a0a32025-06-12 17:07:23 +0800628 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800629 }
630}
631
q.huangfa0a0a32025-06-12 17:07:23 +0800632static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
b.liu68a94c92025-05-24 12:53:41 +0800633{
q.huangfa0a0a32025-06-12 17:07:23 +0800634 if(rsrp <= 97)
b.liu68a94c92025-05-24 12:53:41 +0800635 {
q.huangfa0a0a32025-06-12 17:07:23 +0800636 return 141-rsrp; // 97 map 44
637 // 0 map 141 below 140
b.liu68a94c92025-05-24 12:53:41 +0800638 }
639 else
640 {
q.huangfa0a0a32025-06-12 17:07:23 +0800641 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800642 }
643}
644
q.huangfa0a0a32025-06-12 17:07:23 +0800645static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
b.liu68a94c92025-05-24 12:53:41 +0800646{
q.huangfa0a0a32025-06-12 17:07:23 +0800647 if(rsrq <= 34)
b.liu68a94c92025-05-24 12:53:41 +0800648 {
q.huangfa0a0a32025-06-12 17:07:23 +0800649 return (40-rsrq)/2; //=20-rsrq / 2;
650 // 34 map 3
651 // 0 map 20
b.liu68a94c92025-05-24 12:53:41 +0800652 }
653 else
654 {
q.huangfa0a0a32025-06-12 17:07:23 +0800655 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800656 }
657}
658
q.huang861c07d2025-06-24 16:54:58 +0800659static int32_t sinr_convert_to_10_times_dB(int8 sinr)
q.huang638d5872025-06-21 13:44:43 +0800660{
661 if(sinr <=35 && sinr>=-20)
662 {
663 return sinr*10; //35 map 350 db
664 // -20 map -2000 db
665 }
666 else
667 {
668 return INT_32_MAX;
669 }
670}
671
672
673static int32_t rscp_minus_dbm_convert_to_rssi_dBm(int32_t rscp)
674{
675 if(rscp!=INT_32_MAX)
676 {
677 return -rscp;
678 }
679 else
680 {
681 return INT_32_MAX;
682 }
683}
684
685static int32_t rsrp_minus_dbm_convert_to_rssi_dBm(int32_t rsrp)
686{
687 if(rsrp!=INT_32_MAX)
688 {
689 return -rsrp;
690 }
691 else
692 {
693 return INT_32_MAX;
694 }
695}
696
q.huang861c07d2025-06-24 16:54:58 +0800697static int32_t rxlev_convert_to_rssi_dBm(uint8 rxlev)
698{
699 if(rxlev<=63)
700 {
701 return rxlev-111; //0 map -111, below -110
702 // 63 map -48
703 }
704 else
705 {
706 return INT_32_MAX;
707 }
708
709}
b.liu68a94c92025-05-24 12:53:41 +0800710
q.huangfa0a0a32025-06-12 17:07:23 +0800711//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
712// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
713// * will be 125.*/
714//uint8 ecno; // 0: Ec/Io < -24 dB
715 // 1: -24 dB �� Ec/Io < -23.5 dB
716 // 2: -23.5 dB �� Ec/Io < -23 dB
717 // ......
718 // 47: -1 dB �� Ec/Io < -0.5 dB
719 // 48: -0.5 dB �� Ec/Io < 0 dB
720 // 49: 0 dB �� Ec/Io
721 // 255: not known or not detectabl
722static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
b.liu68a94c92025-05-24 12:53:41 +0800723{
q.huangfa0a0a32025-06-12 17:07:23 +0800724 if(ecno <=49)
b.liu68a94c92025-05-24 12:53:41 +0800725 {
q.huangfa0a0a32025-06-12 17:07:23 +0800726 return 245-ecno*5; //49 map 0 db
727 // 1 map 240 db
728 // 0 map 245 below 240
b.liu68a94c92025-05-24 12:53:41 +0800729 }
q.huangfa0a0a32025-06-12 17:07:23 +0800730 else
b.liu68a94c92025-05-24 12:53:41 +0800731 {
q.huangfa0a0a32025-06-12 17:07:23 +0800732 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800733 }
734}
735
b.liu68a94c92025-05-24 12:53:41 +0800736
b.liu68a94c92025-05-24 12:53:41 +0800737
q.huangfa0a0a32025-06-12 17:07:23 +0800738/* change realCsq to level */
739static int rscpToLevel(int rscp)
b.liu68a94c92025-05-24 12:53:41 +0800740{
q.huangfa0a0a32025-06-12 17:07:23 +0800741
742 if (rscp < -110) {
b.liu68a94c92025-05-24 12:53:41 +0800743 return 0;
q.huangfa0a0a32025-06-12 17:07:23 +0800744 } else if (rscp <= -95) {
745 return rscp+111; // to 16
746 } else if (rscp >=-93 && rscp <=-90) {
747 return rscp+110; // to 20
748 } else if (rscp >=-89 && rscp <=-59) {
749 return (rscp+152)/3; // =(rscp+89)/3+21 to 31
750 } else if (rscp ==- 94) { // Geely requirement, -94 map 16
751 return 16;
752 } else if(rscp <= -25) {
753 return 31;
b.liu68a94c92025-05-24 12:53:41 +0800754 }
q.huangfa0a0a32025-06-12 17:07:23 +0800755 return 99;
b.liu68a94c92025-05-24 12:53:41 +0800756}
757
q.huangfa0a0a32025-06-12 17:07:23 +0800758static int rsrpToLevel(int rsrp)
759{
760 if (rsrp < -130) {
761 return 0;
762 } else if (rsrp <= -118) {
763 return (rsrp+132)/2; // to 7
764 } else if (rsrp <=-109) {
765 return rsrp+125; // to 16
766 } else if (rsrp <=-103) {
767 return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
768 } else if (rsrp <=- 85) {
769 return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
770 } else if(rsrp <= -55) {
771 return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
772 } else if(rsrp <=-44)
773 {
774 return 31;
775 }
776 return 99;
777}
778
q.huang861c07d2025-06-24 16:54:58 +0800779//uint8 rssi; // 0: 113 dBm or less
780 // 1: 111 dBm
781 // 2��30: 109��53 dBm
782 // 31: 51 dBm or greater
783 // 99: not known or not detectable
784//uint8 rxlev;// 0:rssi < -110 dBm
785 // 1: -110 dBm �� rssi < -109 dBm
786 // 2: -109 dBm �� rssi < -108 dBm
787 // 60 ......
788 // 61: -50 dBm �� rssi < -49 dBm
789 // 62: -49 dBm �� rssi < -48 dBm
790 // 63: -48 dBm �� rssi
791 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +0800792
q.huang861c07d2025-06-24 16:54:58 +0800793/* change realCsq to level */
794static int rxlevToLevel(uint8 rxlev)
795{
796 if (rxlev <=60) {
797 return (rxlev+3)/2; // =(rxlev+1)/2+1,
798 // 0 map 1
799 // 1,2 map 2
800 // 59,60 map 31
801 }
802 else if(rxlev <=63)
803 {
804 return 31;
805 }
806 return 99;
807}
b.liu68a94c92025-05-24 12:53:41 +0800808
809static int convert_reg_state(int reg_state_t)
810{
q.huang934ec0e2025-07-22 19:56:59 +0800811 LOGD(GSW_NW,"reg_state_t = %d\n",reg_state_t);
b.liu68a94c92025-05-24 12:53:41 +0800812 int reg_state = 0;
813
814 switch (reg_state_t)
815 {
816 case MBTK_NET_REG_STATE_NON:
817 {
818 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
819 break;
820 }
821 case MBTK_NET_REG_STATE_HOME:
822 {
823 reg_state = GSW_NETWORK_REG_REGISTERED;
824 break;
825 }
826 case MBTK_NET_REG_STATE_SEARCHING:
827 {
828 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
829 break;
830 }
831 case MBTK_NET_REG_STATE_DENIED:
832 {
833 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
834 break;
835 }
836 case MBTK_NET_REG_STATE_UNKNOWN:
837 {
838 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
839 break;
840 }
841 case MBTK_NET_REG_STATE_ROAMING:
842 {
843 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
844 break;
845 }
846 case MBTK_NET_REG_STATE_SMS_ONLY:
847 case MBTK_NET_REG_STATE_ROAMING_SMS:
848 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
849 case MBTK_NET_REG_STATE_CSFB_HOME:
850 case MBTK_NET_REG_STATE_CSFB_ROAMING:
851 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
852 {
853 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
854 break;
855 }
856 }
857
858 return reg_state;
859}
860
861
862static int convert_net_mode(int net_mode)
863{
q.huang934ec0e2025-07-22 19:56:59 +0800864 LOGD(GSW_NW,"net_mode = %d\n",net_mode);
b.liu68a94c92025-05-24 12:53:41 +0800865 switch(net_mode)
866 {
867 case MBTK_RADIO_TECH_GSM:
868 case MBTK_RADIO_TECH_GSM_COMPACT:
869 case MBTK_RADIO_TECH_GSM_EGPRS:
870 {
871 return GSW_NETWORK_RADIO_GSM;
872 }
873 case MBTK_RADIO_TECH_UTRAN:
874 case MBTK_RADIO_TECH_UTRAN_HSDPA:
875 case MBTK_RADIO_TECH_UTRAN_HSUPA:
876 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
877 case MBTK_RADIO_TECH_UTRAN_HSPA:
878 {
879 return GSW_NETWORK_RADIO_UMTS;
880 }
881 case MBTK_RADIO_TECH_E_UTRAN:
882 {
883 return GSW_NETWORK_RADIO_LTE;
884 }
885
886 default:
887 {
888 return GSW_NETWORK_RADIO_NO_SVC;
889 }
890 }
891
892 return GSW_NETWORK_RADIO_NO_SVC;
893}
894
895static int convert_mbtk_net_config(int config)
896{
897 int net_pref = -1;
898
899 switch(config)
900 {
901 case GSW_PREFER_MODE_GSW:
902 {
903 net_pref = 0;
904 break;
905 }
906
907 case GSW_PREFER_MODE_WCDMA:
908 {
909 net_pref = 1;
910 break;
911 }
912
913 case GSW_PREFER_MODE_WCDMA_GSM:
914 {
915 net_pref = 2;
916 break;
917 }
918
919 case GSW_PREFER_MODE_LTE:
920 case GSW_PREFER_MODE_NR5G:
921 case GSW_PREFER_MODE_NR5G_LTE:
922 {
923 net_pref = 5;
924 break;
925 }
926
927 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
928 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
929 {
930 net_pref = 15;
931 break;
932 }
933 }
934
935 return net_pref;
936}
937
938
939static int convert_gsw_net_config(int config)
940{
941 int net_config = -1;
q.huang934ec0e2025-07-22 19:56:59 +0800942 LOGD(GSW_NW,"config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +0800943
944 switch (config)
945 {
946 case 0:
947 {
948 net_config = GSW_PREFER_MODE_GSW;
949 break;
950 }
951
952 case 1:
953 {
954 net_config = GSW_PREFER_MODE_WCDMA;
955 break;
956 }
957
958 case 2:
959 {
960 net_config = GSW_PREFER_MODE_WCDMA_GSM;
961 break;
962 }
963
964 case 5:
965 {
966 net_config = GSW_PREFER_MODE_LTE;
967 break;
968 }
969
970 case 15:
971 {
972 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
973 break;
974 }
975 }
976
977 return net_config;
978}
979
980//64F010 -> 46001 (64->46,F0->0,10->01)
981static void transform_fplmn_str_to_plmn(char *entry)
982{
983 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
984 return; //if FFFFFF,means invalid fplmn, do nothing
985 }
986
987 char temp = entry[0];
988 entry[0] = entry[1];
989 entry[1] = temp;
990
991 temp = entry[ENTRY_LENGTH - 2];
992 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
993 entry[ENTRY_LENGTH - 1] = temp;
994
995 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
996
q.huang934ec0e2025-07-22 19:56:59 +0800997 LOGE(GSW_NW,"after transform_fplmn_str_to_plmn: %s\n", entry);
b.liu68a94c92025-05-24 12:53:41 +0800998
999 //valid fplmn
1000 fplmn_index++;
1001}
1002
1003static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
1004{
1005 strncpy(mcc,entry,3);
1006 mcc[3] = '\0';
1007 strncpy(mnc,entry + 3,2);
1008 mnc[2] = '\0';
1009
q.huang934ec0e2025-07-22 19:56:59 +08001010 LOGE(GSW_NW,"entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
b.liu68a94c92025-05-24 12:53:41 +08001011}
1012
1013
1014static void update_fplmn_list(char *fplmn_str)
1015{
q.huang934ec0e2025-07-22 19:56:59 +08001016 LOGE(GSW_NW,"fplmn_str = %s\n",fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08001017 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
1018 memset(fplmn_array, 0, sizeof(fplmn_array));
1019 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
1020 fplmn_index = 0;
1021 int array_length = 0;
1022
1023 for (int i = 0; i < strlen(fplmn_str); i += 6) {
1024
1025 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
1026 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
1027 temp_fplmn_array[array_length][length] = '\0';
1028 array_length++;
1029 if (i + 6 >= strlen(fplmn_str)) {
1030 break;
1031 }
1032 }
1033
1034 for (int i = 0; i < array_length; i++) {
q.huang934ec0e2025-07-22 19:56:59 +08001035 LOGE(GSW_NW,"array[%d] = %s\n", i, temp_fplmn_array[i]);
b.liu68a94c92025-05-24 12:53:41 +08001036 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1037 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
q.huang934ec0e2025-07-22 19:56:59 +08001038 LOGE(GSW_NW,"fplmn_array[%d] = %s\n", i, fplmn_array[i]);
b.liu68a94c92025-05-24 12:53:41 +08001039 }
1040
1041}
1042
1043static void format_plmn(char *result, char *plmn_entry)
1044{
1045 strncpy(result, plmn_entry, strlen(plmn_entry));
q.huang934ec0e2025-07-22 19:56:59 +08001046 LOGE(GSW_NW,"result = %s, numStr = %s\n",result, plmn_entry);
b.liu68a94c92025-05-24 12:53:41 +08001047
1048 if (strlen(result) >= 2) {
1049 char temp = result[0];
1050 result[0] = result[1];
1051 result[1] = temp;
1052 }
1053
q.huang934ec0e2025-07-22 19:56:59 +08001054 LOGE(GSW_NW,"1.result = %s\n",result);
b.liu68a94c92025-05-24 12:53:41 +08001055
1056 if (strlen(result) >= 3) {
1057 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1058 result[2] = 'F';
1059 }
1060
q.huang934ec0e2025-07-22 19:56:59 +08001061 LOGE(GSW_NW,"2.result = %s\n",result);
b.liu68a94c92025-05-24 12:53:41 +08001062
1063 if (strlen(result) >= 2) {
1064 char temp = result[strlen(result) - 1];
1065 result[strlen(result) - 1] = result[strlen(result) - 2];
1066 result[strlen(result) - 2] = temp;
1067 }
1068
q.huang934ec0e2025-07-22 19:56:59 +08001069 LOGE(GSW_NW,"3.result = %s\n",result);
b.liu68a94c92025-05-24 12:53:41 +08001070}
1071
1072
1073static void convert_plmn_to_fplmn_str(char *fplmn_str)
1074{
1075 char temp_fplmn_str[128] = {0};
1076 char temp[20]; // 临时存储单个格式化后的数字
1077 int index = 0;
1078
1079 for (int i = 0; i < fplmn_index; i++) {
1080 memset(temp, 0x0, sizeof(temp));
1081 format_plmn(temp, fplmn_array[i]);
1082 strcat(temp_fplmn_str, temp);
1083 index += strlen(temp);
1084 }
1085
1086 while(index < (6 * fplmn_max_length))
1087 {
1088 temp_fplmn_str[index++] = 'F';
1089 }
1090
1091 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1092 if (index > (6 * fplmn_max_length)) {
1093 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1094 }
1095
q.huang934ec0e2025-07-22 19:56:59 +08001096 LOGE(GSW_NW,"%s\n", temp_fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08001097 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
q.huang934ec0e2025-07-22 19:56:59 +08001098 LOGE(GSW_NW,"fplmn_str = %s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08001099}
1100
1101static int check_index(char *mcc, char *mnc)
1102{
1103 int i = 0;
1104
1105 for(i = 0; i < fplmn_index; i++)
1106 {
1107 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1108 {
q.huang934ec0e2025-07-22 19:56:59 +08001109 LOGE(GSW_NW,"index = %d\n", i);
b.liu68a94c92025-05-24 12:53:41 +08001110 return i;
1111 }
1112 }
1113
q.huang934ec0e2025-07-22 19:56:59 +08001114 LOGE(GSW_NW,"not find\n");
b.liu68a94c92025-05-24 12:53:41 +08001115 return -1;
1116}
1117
1118static void remove_fplmn(int index)
1119{
1120 int write_index = 0;
1121 for (int i = 0; i < fplmn_index; i++) {
1122 if (i != index) {
1123 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1124 }
1125 }
1126 fplmn_index--;
1127}
1128
q.huangfa0a0a32025-06-12 17:07:23 +08001129static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
1130{
q.huang934ec0e2025-07-22 19:56:59 +08001131 LOGD(GSW_NW,"signal->type=%d", signal->type);
q.huangfa0a0a32025-06-12 17:07:23 +08001132 memset(sig_strength,0,sizeof (signalStrength_t));
1133 switch(signal->type)
1134 {
1135 case MBTK_RADIO_TECH_E_UTRAN:
1136 {
q.huang934ec0e2025-07-22 19:56:59 +08001137 LOGI(GSW_NW,"rsrp = %d",signal->rsrp);
q.huangfa0a0a32025-06-12 17:07:23 +08001138 sig_strength->lte_sig_valid = 1;
q.huangc8b93122025-06-17 17:46:05 +08001139 sig_strength->rsrp = rsrp_convert_to_minus_dBm(signal->rsrp);
1140 sig_strength->rsrq = rsrq_convert_to_minus_dB(signal->rsrq);
q.huang638d5872025-06-21 13:44:43 +08001141 sig_strength->rssi = rsrp_minus_dbm_convert_to_rssi_dBm(sig_strength->rsrp);
q.huang861c07d2025-06-24 16:54:58 +08001142 sig_strength->rssnr= sinr_convert_to_10_times_dB(signal->sinr);
q.huangfa0a0a32025-06-12 17:07:23 +08001143 break;
1144 }
1145 case MBTK_RADIO_TECH_UTRAN:
1146 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1147 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1148 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1149 case MBTK_RADIO_TECH_UTRAN_HSPA:
1150 {
q.huang934ec0e2025-07-22 19:56:59 +08001151 LOGI(GSW_NW,"rscp = %d",signal->rscp);
q.huangfa0a0a32025-06-12 17:07:23 +08001152 sig_strength->wcdma_sig_valid = 1;
1153 sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
1154 sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
q.huang638d5872025-06-21 13:44:43 +08001155 sig_strength->rssi = rscp_minus_dbm_convert_to_rssi_dBm(sig_strength->rscp);
q.huangfa0a0a32025-06-12 17:07:23 +08001156 break;
1157 }
1158 case MBTK_RADIO_TECH_GSM:
1159 case MBTK_RADIO_TECH_GSM_COMPACT:
1160 case MBTK_RADIO_TECH_GSM_EGPRS:
1161 {
q.huang934ec0e2025-07-22 19:56:59 +08001162 LOGI(GSW_NW,"g rxlev = %d",signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001163 sig_strength->gw_sig_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08001164 sig_strength->rssi = rxlev_convert_to_rssi_dBm(signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001165 break;
1166 }
1167 default:
1168 {
q.huang934ec0e2025-07-22 19:56:59 +08001169 LOGE(GSW_NW,"[%s] unknown reg type.[%d]", __func__, signal->type);
q.huangfa0a0a32025-06-12 17:07:23 +08001170 }
1171 }
1172
1173}
1174
q.huang66b79162025-06-27 17:45:34 +08001175/*
q.huang934ec0e2025-07-22 19:56:59 +08001176typedef enum{
1177 MBTK_READY_INIT = -1,
1178 MBTK_READY_SUCCESS,
1179 MBTK_READY_MODEM_FAIL,
1180 MBTK_READY_RESPONSE_FAIL,
1181 MBTK_READY_SOCKET_FAIL,
1182 MBTK_READY_RIL_FAIL
q.huang66b79162025-06-27 17:45:34 +08001183}mbtk_ready_status_type;
1184
q.huang934ec0e2025-07-22 19:56:59 +08001185typedef enum gsw_hal_nw_mode_state_type
1186{
1187 GSW_MODEM_STATE_UNKNOWN = 0,
1188 GSW_MODEM_STATE_ONLINE,
1189 GSW_MODEM_STATE_OFFLINE,
1190 GSW_SDK_STATE_SERVICE_DOWN,
1191 GSW_SDK_STATE_SERVICE_UP,// service down->up 需要routectl 重启
1192 GSW_SDK_STATE_GPS_DOWN,
1193 GSW_SDK_STATE_GPS_UP,
q.huang66b79162025-06-27 17:45:34 +08001194} gsw_mode_state_e;
1195
1196*/
1197
1198static void convert_uci_to_gsw_modem_state(int uci, int *state)
1199{
1200 switch(uci)
q.huangdaa16d42025-07-03 14:32:48 +08001201 {
q.huang66b79162025-06-27 17:45:34 +08001202 case MBTK_READY_SUCCESS:
1203 *state=GSW_MODEM_STATE_ONLINE;
1204 return;
1205 case MBTK_READY_INIT:
1206 *state=GSW_MODEM_STATE_UNKNOWN;
1207 return;
1208 }
1209 *state=GSW_MODEM_STATE_OFFLINE;
1210 return;
1211}
1212
b.liu68a94c92025-05-24 12:53:41 +08001213static void gsw_serving_info_callback_thread()
1214{
q.huang934ec0e2025-07-22 19:56:59 +08001215 GSW_NW_SERVING_INFO serving_info;
1216 int ret = gsw_get_nwinfo(&serving_info);
b.liu68a94c92025-05-24 12:53:41 +08001217 if(ret != 0)
1218 {
q.huang934ec0e2025-07-22 19:56:59 +08001219 LOGE(GSW_NW,"cb gsw_get_nwinfo failed");
b.liu68a94c92025-05-24 12:53:41 +08001220 return;
1221 }
1222
q.huang934ec0e2025-07-22 19:56:59 +08001223 if(serving_cb!=NULL)
b.liu68a94c92025-05-24 12:53:41 +08001224 {
q.huang934ec0e2025-07-22 19:56:59 +08001225 LOGE(GSW_NW,"serving cb called");
1226 serving_cb(serving_info);
1227 }
1228 else
1229 {
1230 LOGE(GSW_NW,"serving cb is NULL");
b.liu68a94c92025-05-24 12:53:41 +08001231 }
1232}
1233
1234static void gsw_serving_info_callback(const void* data, int data_len)
q.huang934ec0e2025-07-22 19:56:59 +08001235{
1236 if (nw_init_flag == 0)
b.liu68a94c92025-05-24 12:53:41 +08001237 {
q.huang934ec0e2025-07-22 19:56:59 +08001238 printf("%s, nw not init\n",__func__);
b.liu68a94c92025-05-24 12:53:41 +08001239 return;
1240 }
q.huang934ec0e2025-07-22 19:56:59 +08001241
1242 pthread_t thread;
1243 int ret=pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1244 if(ret==0)
1245 {
1246 pthread_detach(thread);
1247 }
1248 else
1249 {
1250 LOGE(GSW_NW,"create thread fail, ret is %d",ret);
1251 }
b.liu68a94c92025-05-24 12:53:41 +08001252}
1253
q.huang934ec0e2025-07-22 19:56:59 +08001254
q.huangfa0a0a32025-06-12 17:07:23 +08001255/*typedef struct
q.huang934ec0e2025-07-22 19:56:59 +08001256{
q.huangfa0a0a32025-06-12 17:07:23 +080012570 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
12581 uint8 rssi; // 0: 113 dBm or less
q.huang934ec0e2025-07-22 19:56:59 +08001259 // 1: 111 dBm
1260 // 2��30: 109��53 dBm
1261 // 31: 51 dBm or greater
1262 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012632 uint8 rxlev;// 0:rssi < -110 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001264 // 1: -110 dBm �� rssi < -109 dBm
1265 // 2: -109 dBm �� rssi < -108 dBm
1266 // ......
1267 // 61: -50 dBm �� rssi < -49 dBm
1268 // 62: -49 dBm �� rssi < -48 dBm
1269 // 63: -48 dBm �� rssi
1270 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012713 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
q.huang934ec0e2025-07-22 19:56:59 +08001272 // 99 not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012734 uint8 rscp; // 0: rscp < -120 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001274 // 1: -120 dBm �� rscp < -119 dBm
1275 // 2: -119 dBm �� rscp < -118 dBm
1276 // ......
1277 // 94: -27 dBm �� rscp < -26 dBm
1278 // 95: -26 dBm �� rscp < -25 dBm
1279 // 96: - 25 dBm �� rscp
1280 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012815 uint8 ecno; // 0: Ec/Io < -24 dB
q.huang934ec0e2025-07-22 19:56:59 +08001282 // 1: -24 dB �� Ec/Io < -23.5 dB
1283 // 2: -23.5 dB �� Ec/Io < -23 dB
1284 // ......
1285 // 47: -1 dB �� Ec/Io < -0.5 dB
1286 // 48: -0.5 dB �� Ec/Io < 0 dB
1287 // 49: 0 dB �� Ec/Io
1288 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012896 uint8 rsrq; // 0: rsrq < -19.5 dB
q.huang934ec0e2025-07-22 19:56:59 +08001290 // 1: -19.5 dB �� rsrq < -19 dB
1291 // 2: -19 dB �� rsrq < -18.5 dB
1292 // ......
1293 // 32: -4 dB �� rsrq < -3.5 dB
1294 // 33: -3.5 dB �� rsrq < -3 dB
1295 // 34: -3 dB �� rsrq
1296 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012977 uint8 rsrp; // 0: rsrp < -140 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001298 // 1: -140 dBm �� rsrp < -139 dBm
1299 // 2: -139 dBm �� rsrp < -138 dBm
1300 // ......
1301 // 95: -46 dBm �� rsrp < -45 dBm
1302 // 96: -45 dBm �� rsrp < -44 dBm
1303 // 97: -44 dBm �� rsrp
1304 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080013058 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
q.huang934ec0e2025-07-22 19:56:59 +08001306 // 1: -43 dB <= ss_rsrq < -42.5 dB
1307 // 2: -42.5 dB <= ss_rsrq < -42 dB
1308 // ......
1309 // 125: 19 dB <= ss_rsrq < 19.5 dB
1310 // 126: 19.5 dB <= ss_rsrq < 20 dB
1311 // 255: not known or not detectable
1312 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1313 // 1: -156 dBm <= ss_rsrp < -155 dBm
1314 // 2: -155 dBm <= ss_rsrp < -154 dBm
1315 // ......
1316 // 125: -32 dBm <= ss_rsrp < -31 dBm
1317 // 126: -31 dBm <= ss_rsrp
1318 // 255: not known or not detectable
1319 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1320 // 1: -23 dB  ss_sinr < -22.5 dB
1321 // 2: -22.5 dB  ss_sinr < -22 dB
1322 // ......
1323 // 125: 39 dB  ss_sinr < 39.5 dBm
1324 // 126: 39.5 dB  ss_sinr < 40 dB
1325 // 127: 40 dB  ss_sinr
1326 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +08001327} __attribute__((packed)) mbtk_signal_info_t;
1328*/
b.liu68a94c92025-05-24 12:53:41 +08001329static void gsw_sig_info_callback(const void* data, int data_len)
1330{
q.huang934ec0e2025-07-22 19:56:59 +08001331 if (nw_init_flag == 0)
1332 {
1333 printf("%s, nw not init\n",__func__);
1334 return;
1335 }
1336
q.huangfa0a0a32025-06-12 17:07:23 +08001337 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001338 {
b.liu68a94c92025-05-24 12:53:41 +08001339 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001340 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1341
b.liu68a94c92025-05-24 12:53:41 +08001342 if(sig_cb != NULL)
1343 {
1344 sig_cb(sig_strength);
1345 }
1346 }
b.liu68a94c92025-05-24 12:53:41 +08001347 else
1348 {
q.huang934ec0e2025-07-22 19:56:59 +08001349 LOGE(GSW_NW,"data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001350 }
1351}
1352
q.huangc8b93122025-06-17 17:46:05 +08001353static void gsw_operating_mode_event_callback(const void* data, int data_len)
b.liu68a94c92025-05-24 12:53:41 +08001354{
q.huang934ec0e2025-07-22 19:56:59 +08001355 if (nw_init_flag == 0)
1356 {
1357 printf("%s nw not init\n",__func__);
1358 return;
1359 }
1360
1361 LOGE(GSW_NW,"gsw_operating_mode_event_callback start\n");
b.liu68a94c92025-05-24 12:53:41 +08001362
q.huangc8b93122025-06-17 17:46:05 +08001363
b.liu68a94c92025-05-24 12:53:41 +08001364 if(data && data_len > 0)
1365 {
q.huangc8b93122025-06-17 17:46:05 +08001366 const uint8 *cfun_state = (const uint8*)data;
q.huang934ec0e2025-07-22 19:56:59 +08001367 LOGE(GSW_NW,"gsw_operating_mode_event_callback,data = %d\n", *cfun_state);
q.huangc8b93122025-06-17 17:46:05 +08001368 if(airplane_cb != NULL)
b.liu68a94c92025-05-24 12:53:41 +08001369 {
q.huangc8b93122025-06-17 17:46:05 +08001370 airplane_cb(*cfun_state);
b.liu68a94c92025-05-24 12:53:41 +08001371 }
1372 }
1373
1374}
1375
q.huangdaa16d42025-07-03 14:32:48 +08001376
b.liu68a94c92025-05-24 12:53:41 +08001377static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1378{
q.huang934ec0e2025-07-22 19:56:59 +08001379 if (nw_init_flag == 0)
1380 {
1381 printf("%s nw not init\n",__func__);
1382 return;
1383 }
b.liu68a94c92025-05-24 12:53:41 +08001384
q.huang934ec0e2025-07-22 19:56:59 +08001385 LOGE(GSW_NW,"gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
b.liu68a94c92025-05-24 12:53:41 +08001386
1387 if(reject_cb != NULL)
1388 {
q.huang934ec0e2025-07-22 19:56:59 +08001389 GSW_NW_REJ_CAUSE_E rej_cause;
1390 rej_cause.rej_cause = cause;
1391 rej_cause.rej_rat = rat;
1392 rej_cause.rej_domain = domain;
1393
1394 LOGE(GSW_NW,"reject_cb called\n");
1395 reject_cb(&rej_cause);
b.liu68a94c92025-05-24 12:53:41 +08001396 }
1397 else
1398 {
q.huang934ec0e2025-07-22 19:56:59 +08001399 LOGE(GSW_NW,"reject_cb is NULL\n");
1400 }
1401}
1402
1403void gsw_serving_info_timer()
1404{
1405 if(nw_init_flag == 0 || nw_info_handle == NULL)
1406 {
1407 return;
b.liu68a94c92025-05-24 12:53:41 +08001408 }
1409
q.huang934ec0e2025-07-22 19:56:59 +08001410 while(nw_init_flag)
1411 {
1412 gsw_serving_info_callback_thread();
1413 sleep(SERVING_TIMER);
1414 }
b.liu68a94c92025-05-24 12:53:41 +08001415}
1416
xy.hec89938f2025-05-29 14:08:47 +08001417void gsw_sig_info_timer()
1418{
xy.hec89938f2025-05-29 14:08:47 +08001419 if(nw_init_flag == 0 || nw_info_handle == NULL)
1420 {
1421 return;
1422 }
1423
1424 mbtk_signal_info_t signal;
1425 signalStrength_t sig_strength;
1426
1427 while(nw_init_flag)
1428 {
q.huangfa0a0a32025-06-12 17:07:23 +08001429 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001430 if(ret != 0)
1431 {
q.huang934ec0e2025-07-22 19:56:59 +08001432 LOGE(GSW_NW,"mbtk_net_signal_get fail, ret is %d\n",ret);
q.huang66b79162025-06-27 17:45:34 +08001433
xy.hec89938f2025-05-29 14:08:47 +08001434 }
xy.hec89938f2025-05-29 14:08:47 +08001435 else
1436 {
q.huangfa0a0a32025-06-12 17:07:23 +08001437 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
q.huang66b79162025-06-27 17:45:34 +08001438 if(sig_cb != NULL)
1439 {
1440 sig_cb(sig_strength);
1441 }
xy.hec89938f2025-05-29 14:08:47 +08001442 }
xy.hec89938f2025-05-29 14:08:47 +08001443 sleep(SIG_TIMER);
1444 }
1445}
1446
q.huangdaa16d42025-07-03 14:32:48 +08001447int get_sdk_ready()
1448{
1449 char buffer[MBTK_READY_STRING_SIZE_MAX];
1450 FILE *fp = popen(SDK_READY_CMD, "r");
1451 if(NULL == fp)
1452 {
q.huang934ec0e2025-07-22 19:56:59 +08001453 LOGE(GSW_NW,"popen sdk ready fail");
q.huangdaa16d42025-07-03 14:32:48 +08001454 return -1;
1455 }
1456 memset(buffer,0,sizeof(buffer));
1457 if(fgets(buffer, sizeof(buffer), fp) == NULL)
1458 {
1459 pclose(fp);
q.huang934ec0e2025-07-22 19:56:59 +08001460 LOGE(GSW_NW,"fgets failed:");
q.huangdaa16d42025-07-03 14:32:48 +08001461 return -1;
1462 }
1463 pclose(fp);
q.huang934ec0e2025-07-22 19:56:59 +08001464 LOGE(GSW_NW,"get_sdk_ready:%s",buffer);
q.huangdaa16d42025-07-03 14:32:48 +08001465 return atoi(buffer);
1466}
1467
q.huang66b79162025-06-27 17:45:34 +08001468int gsw_get_modem_state(int *state)
1469{
q.huangdaa16d42025-07-03 14:32:48 +08001470 int uci_value = get_sdk_ready();
1471 if(uci_value < 0)
q.huang66b79162025-06-27 17:45:34 +08001472 {
q.huangdaa16d42025-07-03 14:32:48 +08001473 return GSW_HAL_NORMAL_FAIL;
q.huang66b79162025-06-27 17:45:34 +08001474 }
q.huangdaa16d42025-07-03 14:32:48 +08001475 convert_uci_to_gsw_modem_state(uci_value,state);
1476 return GSW_HAL_SUCCESS;
q.huang66b79162025-06-27 17:45:34 +08001477}
1478
1479int g_mode_state=((int)(GSW_MODEM_STATE_UNKNOWN))-1;
1480void gsw_modem_state_timer()
1481{
1482 while(nw_init_flag)
1483 {
q.huangdaa16d42025-07-03 14:32:48 +08001484 int state;
1485 int ret = gsw_get_modem_state(&state);
q.huang66b79162025-06-27 17:45:34 +08001486 if(modem_cb != NULL)
1487 {
q.huang66b79162025-06-27 17:45:34 +08001488 if(ret != 0)
1489 {
q.huangdaa16d42025-07-03 14:32:48 +08001490 modem_cb(GSW_MODEM_STATE_UNKNOWN);
q.huang66b79162025-06-27 17:45:34 +08001491 }
1492 else if(state!=g_mode_state)
1493 {
q.huang934ec0e2025-07-22 19:56:59 +08001494 LOGE(GSW_NW,"modem state changed from %d to %d",g_mode_state,state);
q.huang66b79162025-06-27 17:45:34 +08001495 g_mode_state=state;
1496 modem_cb(state);
1497 }
1498 }
1499 sleep(MODEM_TIMER);
1500 }
1501}
1502
1503
b.liu68a94c92025-05-24 12:53:41 +08001504
1505/**
1506 * @brief SDK interface to call back serving info
1507 * @param [in] handle_ptr
1508 * @retval 0: success
1509 * @retval other: fail
1510 */
1511int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1512{
1513 if (nw_init_flag == 0 || nw_info_handle == NULL)
1514 {
xy.heb41615b2025-05-28 16:33:20 +08001515 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001516 }
1517
q.huang934ec0e2025-07-22 19:56:59 +08001518 void* cb_func;
b.liu68a94c92025-05-24 12:53:41 +08001519 if(handle_ptr == NULL)
1520 {
q.huang934ec0e2025-07-22 19:56:59 +08001521 LOGE(GSW_NW,"serving info handle_ptr is NULL\n");
1522 cb_func=NULL;
1523 }
1524 else
1525 {
1526 cb_func=(void*) gsw_serving_info_callback;
1527 }
1528
1529 int ret = mbtk_net_state_change_cb_reg(nw_info_handle, cb_func);
1530 if (ret != 0)
1531 {
1532 LOGW(GSW_NW,"mbtk_net_state_change_cb_reg fail, ret is %d",ret);
xy.heb41615b2025-05-28 16:33:20 +08001533 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001534 }
q.huang934ec0e2025-07-22 19:56:59 +08001535 serving_cb=handle_ptr;
b.liu68a94c92025-05-24 12:53:41 +08001536 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08001537}
1538
1539
1540/**
1541 * @brief SDK interface to call back sig info
1542 * @param [in] handle_ptr
1543 * @retval 0: success
1544 * @retval other: fail
1545 */
1546int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1547{
1548 if (nw_init_flag == 0 || nw_info_handle == NULL)
1549 {
xy.heb41615b2025-05-28 16:33:20 +08001550 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001551 }
1552
q.huang934ec0e2025-07-22 19:56:59 +08001553 void* cb_func;
b.liu68a94c92025-05-24 12:53:41 +08001554 if(handle_ptr == NULL)
1555 {
q.huang934ec0e2025-07-22 19:56:59 +08001556 LOGE(GSW_NW,"serving info handle_ptr is NULL\n");
1557 cb_func=NULL;
1558 }
1559 else
1560 {
1561 cb_func=(void*) gsw_sig_info_callback;
1562 }
1563
1564 int ret = mbtk_signal_state_change_cb_reg(nw_info_handle, cb_func);
1565
1566 if (ret != 0)
1567 {
1568 LOGE(GSW_NW,"mbtk_signal_state_change_cb_reg fail, ret is %d", ret);
1569 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001570 }
1571
1572 sig_cb = handle_ptr;
1573
1574 return GSW_HAL_SUCCESS;
1575
1576}
1577
1578
1579/**
1580 * @brief SDK interface to call back rej cause
1581 * @param [in] handle_ptr
1582 * @retval 0: success
1583 * @retval other: fail
1584 */
1585int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1586{
1587 if (nw_init_flag == 0 || nw_info_handle == NULL)
1588 {
xy.heb41615b2025-05-28 16:33:20 +08001589 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001590 }
1591
1592 if(handle_ptr == NULL)
1593 {
q.huang934ec0e2025-07-22 19:56:59 +08001594 LOGE(GSW_NW,"rej cause handle_ptr is NULL\n");
b.liu68a94c92025-05-24 12:53:41 +08001595 }
1596
1597 reject_cb = handle_ptr;
1598
1599 return GSW_HAL_SUCCESS;
1600}
1601
1602
1603/**
1604 * @brief network sdk init
1605 * @param [in] token usr id define by who use
1606 * @retval 0: success
1607 * @retval other: fail
1608 */
1609int gsw_nw_sdk_init(int token)
1610{
1611 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001612 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001613
1614 if (nw_init_flag == 1 && nw_info_handle != NULL)
1615 {
1616 return GSW_HAL_SUCCESS;
1617 }
1618
1619 ret = mbtk_nw_api_import();
1620 if (ret != 0)
1621 {
q.huangdaa16d42025-07-03 14:32:48 +08001622 printf("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001623 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001624 }
1625
1626 nw_info_handle = mbtk_info_handle_get();
1627
1628 if (nw_info_handle == NULL)
1629 {
q.huang934ec0e2025-07-22 19:56:59 +08001630 LOGE(GSW_NW,"mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001631 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001632 }
1633
1634 char fplmn[256] = {0};
1635 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1636 if(ret != 0)
1637 {
q.huang934ec0e2025-07-22 19:56:59 +08001638 LOGE(GSW_NW,"mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001639 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001640 }
1641 fplmn_max_length = (strlen(fplmn)/6);
q.huang934ec0e2025-07-22 19:56:59 +08001642 LOGE(GSW_NW,"fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1643
b.liu68a94c92025-05-24 12:53:41 +08001644
q.huang66b79162025-06-27 17:45:34 +08001645 nw_init_flag = 1;
1646
xy.hec89938f2025-05-29 14:08:47 +08001647 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1648 if (ret != 0)
1649 {
q.huang934ec0e2025-07-22 19:56:59 +08001650 LOGE(GSW_NW,"pthread_create fail 1,ret is %d", ret);
q.huang66b79162025-06-27 17:45:34 +08001651 nw_init_flag = 0;
1652 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
xy.hec89938f2025-05-29 14:08:47 +08001653 }
1654
q.huang66b79162025-06-27 17:45:34 +08001655
1656 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_modem_state_timer, NULL);
1657 if (ret != 0)
1658 {
q.huang934ec0e2025-07-22 19:56:59 +08001659 LOGE(GSW_NW,"pthread_create fail 2,ret is %d", ret);
1660 nw_init_flag = 0;
1661 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
1662 }
1663
1664 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_serving_info_timer, NULL);
1665 if (ret != 0)
1666 {
1667 LOGE(GSW_NW,"pthread_create fail 3,ret is %d", ret);
q.huang66b79162025-06-27 17:45:34 +08001668 nw_init_flag = 0;
1669 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
1670 }
b.liu68a94c92025-05-24 12:53:41 +08001671
1672 return GSW_HAL_SUCCESS;
1673}
1674
1675
1676/**
1677 * @brief network sdk deinit
1678 * @param
1679 * @retval 0: success
1680 * @retval other: fail
1681 */
1682int gsw_nw_sdk_deinit(void)
1683{
1684 int ret = -1;
1685
1686 if (nw_init_flag == 0 || nw_info_handle == NULL)
1687 {
xy.heb41615b2025-05-28 16:33:20 +08001688 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001689 }
1690
1691 ret = mbtk_info_handle_free(&nw_info_handle);
1692 if(ret != GSW_HAL_SUCCESS)
1693 {
q.huang934ec0e2025-07-22 19:56:59 +08001694 LOGE(GSW_NW,"mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001695 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001696 }
1697
1698 dlclose(dlHandle_mbtk);
1699 nw_info_handle = NULL;
1700 nw_init_flag = 0;
1701
1702 return GSW_HAL_SUCCESS;
1703
1704}
1705
1706
1707/**
1708 * @brief get current network reg info
1709 * @param [out] serving_info struct for network info
1710 * include regstate ps_state opreator name mcc mcn etc
1711 * @retval 0: success
1712 * @retval other: fail
1713 */
1714int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1715{
1716
1717 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001718 if (nw_init_flag == 0 || nw_info_handle == NULL)
1719 {
q.huang238b22a2025-06-10 14:36:59 +08001720 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001721 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001722 }
1723
q.huang934ec0e2025-07-22 19:56:59 +08001724 LOGE(GSW_NW,"mbtk_net_reg_get start \n");
b.liu68a94c92025-05-24 12:53:41 +08001725 //regstate
1726 mbtk_net_reg_info_t reg;
b.liu68a94c92025-05-24 12:53:41 +08001727 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1728 if(ret)
1729 {
q.huang934ec0e2025-07-22 19:56:59 +08001730 LOGE(GSW_NW,"mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001731 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001732 }
1733
q.huang934ec0e2025-07-22 19:56:59 +08001734 LOGE(GSW_NW,"convert_cs_reg_state\n");
b.liu68a94c92025-05-24 12:53:41 +08001735 //cs_state
1736 serving_info->reg_state = convert_reg_state(reg.call_state);
q.huang934ec0e2025-07-22 19:56:59 +08001737 LOGE(GSW_NW,"convert_ps_reg_state\n");
b.liu68a94c92025-05-24 12:53:41 +08001738 //ps_state
1739 serving_info->ps_state = convert_reg_state(reg.data_state);
q.huang934ec0e2025-07-22 19:56:59 +08001740 LOGE(GSW_NW,"convert_rat_mode\n");
b.liu68a94c92025-05-24 12:53:41 +08001741 //reg_rat
1742 serving_info->reg_rat = convert_net_mode(reg.type);
1743 //srv_domain
1744 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1745 {
1746 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1747 {
1748 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1749 }
1750
1751 else
1752 {
1753 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1754 }
1755 }
1756
1757 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1758 {
1759 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1760 }
1761
1762 else
1763 {
1764 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1765 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1766 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1767 }
1768
q.huang934ec0e2025-07-22 19:56:59 +08001769 LOGD(GSW_NW,"roaming_ind\n");
b.liu68a94c92025-05-24 12:53:41 +08001770 //roaming_ind
1771 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1772 {
1773 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1774 }
1775 else
1776 {
1777 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1778 }
1779
q.huang934ec0e2025-07-22 19:56:59 +08001780 LOGD(GSW_NW,"reject\n");
b.liu68a94c92025-05-24 12:53:41 +08001781 //reject
1782 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1783 {
q.huang934ec0e2025-07-22 19:56:59 +08001784 LOGD(GSW_NW,"reject_callback\n");
b.liu68a94c92025-05-24 12:53:41 +08001785 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1786 }
1787
q.huang934ec0e2025-07-22 19:56:59 +08001788 LOGD(GSW_NW,"reg_plmn / operator name\n");
b.liu68a94c92025-05-24 12:53:41 +08001789 //reg_plmn / operator name
1790 mbtk_net_info_t net;
q.huang934ec0e2025-07-22 19:56:59 +08001791 LOGD(GSW_NW,"mbtk_net_sel_mode_get start \n");
b.liu68a94c92025-05-24 12:53:41 +08001792 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
q.huang934ec0e2025-07-22 19:56:59 +08001793 LOGD(GSW_NW,"mbtk_net_sel_mode_get end \n");
b.liu68a94c92025-05-24 12:53:41 +08001794 if(ret == 0 && net.plmn > 0)
1795 {
1796 int i = 0;
1797
q.huang934ec0e2025-07-22 19:56:59 +08001798 LOGD(GSW_NW,"start to find mcc");
b.liu68a94c92025-05-24 12:53:41 +08001799 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1800 {
1801 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1802 {
q.huang934ec0e2025-07-22 19:56:59 +08001803 LOGD(GSW_NW,"find mcc\n");
b.liu68a94c92025-05-24 12:53:41 +08001804 break;
1805 }
1806 i++;
1807 }
1808
1809
1810 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1811 {
q.huang934ec0e2025-07-22 19:56:59 +08001812 LOGD(GSW_NW,"not find mcc");
b.liu68a94c92025-05-24 12:53:41 +08001813 strcpy(serving_info->operator_name, "unknown");
hong.liud2417072025-06-27 07:10:37 -07001814 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001815 }
1816
1817 else
1818 {
q.huang934ec0e2025-07-22 19:56:59 +08001819 LOGD(GSW_NW,"find mcc\n");
b.liu68a94c92025-05-24 12:53:41 +08001820 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
hong.liud2417072025-06-27 07:10:37 -07001821 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001822 }
1823
q.huang934ec0e2025-07-22 19:56:59 +08001824 LOGE(GSW_NW,"operator_name = %s\n", serving_info->operator_name);
1825 LOGE(GSW_NW,"reg_plmn = %s\n", serving_info->reg_plmn);
b.liu68a94c92025-05-24 12:53:41 +08001826 }
1827
1828
q.huang934ec0e2025-07-22 19:56:59 +08001829 LOGD(GSW_NW,"get cell id/tac/lac/sid/nid\n");
b.liu68a94c92025-05-24 12:53:41 +08001830 //cell id/tac/lac/sid/nid
1831 mbtk_cell_type_enum cell_type;
b.liu68a94c92025-05-24 12:53:41 +08001832 list_node_t* cell_list = NULL;
1833
q.huang934ec0e2025-07-22 19:56:59 +08001834 LOGD(GSW_NW,"mbtk_cell_get start\n");
b.liu68a94c92025-05-24 12:53:41 +08001835 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1836 if(ret != 0 || cell_list == NULL)
1837 {
q.huang934ec0e2025-07-22 19:56:59 +08001838 LOGE(GSW_NW,"mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001839 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001840 }
1841 else
1842 {
q.huang934ec0e2025-07-22 19:56:59 +08001843 LOGE(GSW_NW,"mbtk_cell_get end,start to get node\n");
b.liu68a94c92025-05-24 12:53:41 +08001844 list_first(cell_list);
q.huang934ec0e2025-07-22 19:56:59 +08001845 LOGE(GSW_NW,"list_first end\n");
b.liu68a94c92025-05-24 12:53:41 +08001846 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1847 if(cell)
1848 {
q.huang934ec0e2025-07-22 19:56:59 +08001849 LOGE(GSW_NW,"cell is not null,value2 = %u\n",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001850 switch(cell_type)
1851 {
1852 case MBTK_CELL_TYPE_LTE:
1853 {
q.huang934ec0e2025-07-22 19:56:59 +08001854 LOGE(GSW_NW,"is lte\n");
1855 //LOGE(GSW_NW,"LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1856 LOGE(GSW_NW,"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 -07001857 snprintf(serving_info->tac,sizeof(serving_info->tac),"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001858 strcpy(serving_info->lac,"");
hong.liud2417072025-06-27 07:10:37 -07001859 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%u",cell->value10);
b.liu68a94c92025-05-24 12:53:41 +08001860 break;
1861 }
1862
1863 case MBTK_CELL_TYPE_GSM:
1864 {
q.huang934ec0e2025-07-22 19:56:59 +08001865 LOGE(GSW_NW,"is gsm\n");
1866 LOGE(GSW_NW,"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 -07001867 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001868 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001869 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001870 break;
1871 }
1872 case MBTK_CELL_TYPE_UMTS:
1873 {
q.huang934ec0e2025-07-22 19:56:59 +08001874 LOGE(GSW_NW,"is wcdma\n");
1875 LOGE(GSW_NW,"UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
hong.liud2417072025-06-27 07:10:37 -07001876 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001877 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001878 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001879 break;
1880 }
1881
1882 default:
1883 break;
1884 }
1885 }
1886 else
1887 {
q.huang934ec0e2025-07-22 19:56:59 +08001888 LOGE(GSW_NW,"cell is null\n");
b.liu68a94c92025-05-24 12:53:41 +08001889 }
1890 }
1891
1892 //not support now
1893 serving_info->sid = 0;
1894 serving_info->nid = 0;
1895
1896 return GSW_HAL_SUCCESS;
1897}
1898
1899
1900/**
1901 * @brief get current network type
1902 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1903 * @retval 0: success
1904 * @retval other: fail
1905 */
hong.liud2417072025-06-27 07:10:37 -07001906int gsw_get_netype(int32_t *netype)
b.liu68a94c92025-05-24 12:53:41 +08001907{
1908 int ret = -1;
1909
1910 if (nw_init_flag == 0 || nw_info_handle == NULL)
1911 {
xy.heb41615b2025-05-28 16:33:20 +08001912 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001913 }
1914
1915 //regstate
1916 mbtk_net_reg_info_t reg;
1917 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1918 if(ret)
1919 {
q.huang934ec0e2025-07-22 19:56:59 +08001920 LOGE(GSW_NW,"mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001921 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001922 }
1923
1924 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1925 {
1926 *netype = convert_net_mode(reg.type);
1927 }
1928 else
1929 {
1930 *netype = GSW_NETWORK_RADIO_NO_SVC;
1931 }
1932
1933 return GSW_HAL_SUCCESS;
1934}
1935
1936
1937/**
1938 * @brief get radio opmode, as open and close airplane mode
1939 * @param [out] op_mode 1 is radio on, 0 is radio off
1940 * @retval 0: success
1941 * @retval other: fail
1942 */
1943int gsw_get_opmode(int *op_mode)
1944{
1945 int tmp_rf = -1;
1946 int ret = -1;
1947 if (nw_init_flag == 0 || nw_info_handle == NULL)
1948 {
xy.heb41615b2025-05-28 16:33:20 +08001949 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001950 }
1951
1952 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1953 if (ret != 0)
1954 {
q.huang934ec0e2025-07-22 19:56:59 +08001955 LOGE(GSW_NW,"mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001956 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001957 }
1958 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1959 {
1960 *op_mode = GSW_OP_MODE_LPM;
1961 }
1962
1963 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1964 {
1965 *op_mode = GSW_OP_MODE_OFFLINE;
1966 }
1967
1968 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
1969 {
1970 *op_mode = GSW_OP_MODE_ONLINE;
1971 }
1972
1973 return GSW_HAL_SUCCESS;
1974}
1975
1976
1977
1978/**
1979 * @brief set radio opmode, as open and close airplane mode
1980 * @param [in] op_mode 1 is radio on, 0 is radio off
1981 * @retval 0: success
1982 * @retval other: fail
1983 */
hong.liud2417072025-06-27 07:10:37 -07001984int gsw_set_opmode(int32_t op_mode)
b.liu68a94c92025-05-24 12:53:41 +08001985{
1986 mbtk_modem_info_t info;
1987 int rf_mode = -1;
1988 int ret = -1;
1989
1990 if (nw_init_flag == 0 || nw_info_handle == NULL)
1991 {
xy.heb41615b2025-05-28 16:33:20 +08001992 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001993 }
1994
1995 if(op_mode == GSW_OP_MODE_LPM)
1996 {
1997 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
1998 }
1999
2000 if(op_mode == GSW_OP_MODE_ONLINE)
2001 {
2002 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
2003 }
2004
2005 if(op_mode == GSW_OP_MODE_OFFLINE)
2006 {
2007 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
2008 }
2009
2010 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
2011 {
q.huang934ec0e2025-07-22 19:56:59 +08002012 LOGE(GSW_NW,"Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002013 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002014 }
2015
2016 info.fun = rf_mode;
2017 info.rst = 0;
2018 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2019 if (ret != 0)
2020 {
q.huang934ec0e2025-07-22 19:56:59 +08002021 LOGE(GSW_NW,"gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002022 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002023 }
2024
2025 return GSW_HAL_SUCCESS;
2026
2027}
2028
2029
2030/**
2031 * @brief get network mode preference of mdm search network scale
2032 * @param [out] mode_pref net_work pref mode:
2033 * enum prefer_mode
2034 * @retval 0: success
2035 * @retval other: fail
2036 */
hong.liud2417072025-06-27 07:10:37 -07002037int gsw_get_mode_preference(int32_t *mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002038{
2039 if (nw_init_flag == 0 || nw_info_handle == NULL)
2040 {
xy.heb41615b2025-05-28 16:33:20 +08002041 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002042 }
2043
2044 int ret = -1;
2045 mbtk_band_info_t band;
2046 memset(&band, 0, sizeof(mbtk_band_info_t));
2047
2048 ret = mbtk_current_band_get(nw_info_handle, &band);
2049 if(ret != 0)
2050 {
q.huang934ec0e2025-07-22 19:56:59 +08002051 LOGE(GSW_NW,"mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002052 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002053 }
2054
2055 *mode_pref = convert_gsw_net_config(band.net_pref);
q.huang934ec0e2025-07-22 19:56:59 +08002056 LOGE(GSW_NW,"band.net_pref = %d\n", *mode_pref);
b.liu68a94c92025-05-24 12:53:41 +08002057 if(*mode_pref <= 0)
2058 {
q.huang934ec0e2025-07-22 19:56:59 +08002059 LOGE(GSW_NW,"no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002060 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002061 }
2062 return GSW_HAL_SUCCESS;
2063
2064
2065}
2066
2067/**
2068 * @brief set network mode preference of mdm search network scale
2069 * @param [in] mode_pref net_work pref mode:
2070 * enum prefer_mode
2071 * @retval 0: success
2072 * @retval other: fail
2073 */
hong.liud2417072025-06-27 07:10:37 -07002074int gsw_set_mode_preference(int32_t mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002075{
2076 if (nw_init_flag == 0 || nw_info_handle == NULL)
2077 {
xy.heb41615b2025-05-28 16:33:20 +08002078 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002079 }
2080
2081 int ret = -1;
2082
2083 mbtk_band_info_t band;
2084 memset(&band, 0, sizeof(mbtk_band_info_t));
2085
2086 band.net_pref = convert_mbtk_net_config(mode_pref);
q.huang934ec0e2025-07-22 19:56:59 +08002087 LOGE(GSW_NW,"band.net_pref = %d\n", band.net_pref);
b.liu68a94c92025-05-24 12:53:41 +08002088
2089 if(band.net_pref < 0)
2090 {
q.huang934ec0e2025-07-22 19:56:59 +08002091 LOGE(GSW_NW,"no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002092 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002093 }
2094
2095 ret = mbtk_current_band_set(nw_info_handle, &band);
2096 if(ret != 0)
2097 {
q.huang934ec0e2025-07-22 19:56:59 +08002098 LOGE(GSW_NW,"mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002099 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002100 }
2101
2102 return GSW_HAL_SUCCESS;
2103}
2104
2105/**
2106 * @brief get signal csq value
2107 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
2108 * @retval 0: success
2109 * @retval other: fail
2110 */
hong.liud2417072025-06-27 07:10:37 -07002111int gsw_get_sig_info(int32_t *csq_value)
b.liu68a94c92025-05-24 12:53:41 +08002112{
b.liu68a94c92025-05-24 12:53:41 +08002113 if (nw_init_flag == 0 || nw_info_handle == NULL)
2114 {
xy.heb41615b2025-05-28 16:33:20 +08002115 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002116 }
2117
q.huangdaa16d42025-07-03 14:32:48 +08002118 mbtk_signal_info_t signal;
q.huangfa0a0a32025-06-12 17:07:23 +08002119 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08002120 if(ret != 0)
2121 {
q.huang934ec0e2025-07-22 19:56:59 +08002122 LOGE(GSW_NW,"mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002123 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002124 }
2125
q.huang934ec0e2025-07-22 19:56:59 +08002126 LOGD(GSW_NW,"signal.type=%d\n", signal.type);
b.liu68a94c92025-05-24 12:53:41 +08002127 switch(signal.type)
2128 {
q.huangfa0a0a32025-06-12 17:07:23 +08002129
b.liu68a94c92025-05-24 12:53:41 +08002130 case MBTK_RADIO_TECH_E_UTRAN:
2131 {
q.huang934ec0e2025-07-22 19:56:59 +08002132 LOGD(GSW_NW,"lte rsrp = %d dbm",signal.rsrp-141);
q.huangfa0a0a32025-06-12 17:07:23 +08002133 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08002134 break;
2135 }
2136 case MBTK_RADIO_TECH_UTRAN:
2137 case MBTK_RADIO_TECH_UTRAN_HSDPA:
2138 case MBTK_RADIO_TECH_UTRAN_HSUPA:
2139 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
2140 case MBTK_RADIO_TECH_UTRAN_HSPA:
2141 {
q.huang934ec0e2025-07-22 19:56:59 +08002142 LOGD(GSW_NW,"w rscp = %d dbm",signal.rscp-121);
q.huangfa0a0a32025-06-12 17:07:23 +08002143 *csq_value = rscpToLevel(signal.rscp-121);
2144 break;
2145 }
2146 case MBTK_RADIO_TECH_GSM:
2147 case MBTK_RADIO_TECH_GSM_COMPACT:
2148 case MBTK_RADIO_TECH_GSM_EGPRS:
2149 {
q.huang934ec0e2025-07-22 19:56:59 +08002150 LOGD(GSW_NW,"gsm rxlev = %d (0-63)",signal.rxlev);
q.huang861c07d2025-06-24 16:54:58 +08002151 *csq_value = rxlevToLevel(signal.rxlev);
b.liu68a94c92025-05-24 12:53:41 +08002152 break;
2153 }
2154 default:
2155 {
q.huang934ec0e2025-07-22 19:56:59 +08002156 LOGE(GSW_NW,"[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08002157 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002158 }
2159 }
2160 return GSW_HAL_SUCCESS;
2161}
2162
2163/**
2164 * @brief set nework power mode, for tcam enter standby or exit standby
2165 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
2166 * @retval 0: success
2167 * @retval other: fail
2168 */
lichengzhang0ba58962025-07-15 17:39:03 +08002169
2170int gsw_nw_power_mode = 0;
b.liu68a94c92025-05-24 12:53:41 +08002171int gsw_network_set_power_mode(char mode)
2172{
lichengzhang640b4f82025-07-21 16:19:33 +08002173 int ret = -1;
2174 if (nw_init_flag == 0)//nw_info_handle == NULL Don't need
b.liu68a94c92025-05-24 12:53:41 +08002175 {
xy.heb41615b2025-05-28 16:33:20 +08002176 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002177 }
2178
2179 if(mode != 0 && mode != 1)
2180 {
q.huang934ec0e2025-07-22 19:56:59 +08002181 LOGE(GSW_NW,"Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002182 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002183 }
2184
2185 if(mode == 1)
lichengzhang0ba58962025-07-15 17:39:03 +08002186 gsw_nw_power_mode = 3;
2187 else
2188 gsw_nw_power_mode = 1;
q.huang934ec0e2025-07-22 19:56:59 +08002189
2190 LOGE(GSW_NW,"mode is %d\n",gsw_nw_power_mode);
lichengzhang640b4f82025-07-21 16:19:33 +08002191 ret = mbtk_wakeup_state_set(nw_info_handle, gsw_nw_power_mode);
2192 if(ret != 0)
2193 {
q.huang934ec0e2025-07-22 19:56:59 +08002194 LOGE(GSW_NW,"mbtk_wakeup_state_set fail\n");
lichengzhang640b4f82025-07-21 16:19:33 +08002195 return GSW_HAL_NORMAL_FAIL;
2196 }
b.liu68a94c92025-05-24 12:53:41 +08002197
2198 return GSW_HAL_SUCCESS;
2199
b.liu68a94c92025-05-24 12:53:41 +08002200}
2201
2202/**
2203 * @brief convert rsrp rscp rssi to csq value.
2204 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2205 * @param [in] sigvalue input signal_strength for different nettype
2206 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2207
2208 * @retval csq
2209 * @retval other: fail
2210 */
hong.liud2417072025-06-27 07:10:37 -07002211int gsw_sigInfo_to_csq(int32_t netType, int32_t sigValue)
b.liu68a94c92025-05-24 12:53:41 +08002212{
q.huang238b22a2025-06-10 14:36:59 +08002213 if (nw_init_flag == 0 || nw_info_handle == NULL)
2214 {
2215 return GSW_HAL_NORMAL_FAIL;
2216 }
b.liu68a94c92025-05-24 12:53:41 +08002217 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002218 {
2219 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002220 {
q.huangfa0a0a32025-06-12 17:07:23 +08002221 return rsrpToLevel(sigValue);
2222 }
2223 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002224 {
q.huangfa0a0a32025-06-12 17:07:23 +08002225 return rscpToLevel(sigValue);
2226 }
2227 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002228 {
q.huangfa0a0a32025-06-12 17:07:23 +08002229 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002230 }
2231
2232 default:
2233 {
q.huang934ec0e2025-07-22 19:56:59 +08002234 LOGE(GSW_NW,"parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002235 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002236 }
2237 }
2238}
2239
2240/*
2241 * @brief get mobile operator name
2242 @param [out] nw_operator_name_infos get the long and short operator name info
2243 @retval 0: success
2244 @retval 0: other: fail
2245 */
2246int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2247{
2248 char OperatorFN[128];
2249 char OperatorSH[128];
hong.liud2417072025-06-27 07:10:37 -07002250 char temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002251 mbtk_net_info_t net;
2252
2253 if (nw_init_flag == 0 || nw_info_handle == NULL)
2254 {
xy.heb41615b2025-05-28 16:33:20 +08002255 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002256 }
2257
2258 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2259 {
q.huang934ec0e2025-07-22 19:56:59 +08002260 LOGE(GSW_NW,"Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08002261 int i = 0;
2262 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2263 {
2264 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2265 break;
2266 i++;
2267 }
2268
2269 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2270 {
2271 strcpy(OperatorFN, "UNKNOWN");
2272 strcpy(OperatorSH, "UNKNOWN");
2273 }
2274 else
2275 {
2276 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2277 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2278
q.huangdaa16d42025-07-03 14:32:48 +08002279
hong.liud2417072025-06-27 07:10:37 -07002280 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
b.liu68a94c92025-05-24 12:53:41 +08002281 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2282
q.huangdaa16d42025-07-03 14:32:48 +08002283
hong.liud2417072025-06-27 07:10:37 -07002284 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
b.liu68a94c92025-05-24 12:53:41 +08002285 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2286 }
2287
2288 memset(nw_operator_name_infos->long_eons,0,128);
2289 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2290 memset(nw_operator_name_infos->short_eons,0,128);
2291 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2292
2293 return GSW_HAL_SUCCESS;
2294 }
2295
2296 else
2297 {
q.huang934ec0e2025-07-22 19:56:59 +08002298 LOGE(GSW_NW,"mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002299 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002300 }
2301
2302 return GSW_HAL_SUCCESS;
2303}
2304
2305
2306/*
2307 * @brief get current serving cell info
2308 * @param cell_info: [out] struct for current cell info
2309 * include earfcn mcc mnc pci psc tac lac etc.
2310 * @return int: 0 is success, other failed
2311 */
2312int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2313{
b.liu68a94c92025-05-24 12:53:41 +08002314
2315 if (nw_init_flag == 0 || nw_info_handle == NULL)
2316 {
q.huang238b22a2025-06-10 14:36:59 +08002317 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002318 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002319 }
2320
2321 list_node_t* cell_list = NULL;
b.liu68a94c92025-05-24 12:53:41 +08002322 mbtk_cell_type_enum type;
q.huang638d5872025-06-21 13:44:43 +08002323 int ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
b.liu68a94c92025-05-24 12:53:41 +08002324 if(ret || cell_list == NULL) {
q.huang934ec0e2025-07-22 19:56:59 +08002325 LOGE(GSW_NW,"mbtk_cell_get failed : %d\n", ret);
q.huang638d5872025-06-21 13:44:43 +08002326 list_free(cell_list);
2327 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002328 } else {
q.huang638d5872025-06-21 13:44:43 +08002329 memset(cell_info,0,sizeof(GSW_NW_CELL_INFO));
b.liu68a94c92025-05-24 12:53:41 +08002330 list_first(cell_list);
2331 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2332 if(cell) { // Current server cell.
2333 switch(type)
2334 {
2335 case 0:
2336 {
q.huang934ec0e2025-07-22 19:56:59 +08002337 LOGD(GSW_NW,"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 +08002338 char gsm_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002339
2340 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2341
2342 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002343 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002344 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2345
b.liu68a94c92025-05-24 12:53:41 +08002346 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002347 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value6);
b.liu68a94c92025-05-24 12:53:41 +08002348 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2349
2350 cell_info->cell_id_valid = 1;
2351 cell_info->cell_id = cell->value2;
2352
2353 cell_info->lac_valid = 1;
2354 cell_info->lac = cell->value1;
2355
2356 cell_info->arfcn_valid = 1;
2357 cell_info->arfcn = cell->value3;
q.huang861c07d2025-06-24 16:54:58 +08002358
2359 cell_info->rssi=rxlev_convert_to_rssi_dBm(cell->value7);
2360 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002361 break;
2362 }
2363
2364 case 1:
2365 {
q.huang934ec0e2025-07-22 19:56:59 +08002366 LOGD(GSW_NW,"UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
q.huangdaa16d42025-07-03 14:32:48 +08002367 char wcdma_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002368
2369 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2370
2371 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002372 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value4);
b.liu68a94c92025-05-24 12:53:41 +08002373 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2374
b.liu68a94c92025-05-24 12:53:41 +08002375 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002376 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002377 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2378
2379 cell_info->lac_valid = 1;
2380 cell_info->lac = cell->value1;
2381
2382 cell_info->cell_id_valid = 1;
2383 cell_info->cell_id = cell->value2;
2384
2385 cell_info->uarfcn_valid = 1;
2386 cell_info->uarfcn = cell->value3;
2387
2388 cell_info->psc_valid = 1;
2389 cell_info->psc = cell->value6;
2390 break;
2391 }
2392
2393 case 2:
2394 {
q.huang934ec0e2025-07-22 19:56:59 +08002395 LOGE(GSW_NW,"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 +08002396
q.huangdaa16d42025-07-03 14:32:48 +08002397 char lte_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002398 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2399
2400 cell_info->mcc_valid = 1;
2401 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2402 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2403
b.liu68a94c92025-05-24 12:53:41 +08002404 cell_info->mnc_valid = 1;
2405 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2406 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2407
2408 cell_info->tac_valid = 1;
2409 cell_info->tac = cell->value1;
2410
2411 cell_info->pci_valid = 1;
2412 cell_info->pci = cell->value2;
2413
2414 cell_info->earfcn_valid = 1;
2415 cell_info->earfcn = cell->value3;
2416
2417 cell_info->bler_valid = 1;
2418 cell_info->bler = cell->value4;
2419
2420 cell_info->band_valid = 1;
2421 cell_info->band = cell->value5;
2422
q.huang638d5872025-06-21 13:44:43 +08002423 cell_info->rssnr = sinr_convert_to_10_times_dB(cell->value11);
2424 cell_info->rssnr_valid=(cell_info->rssnr!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002425
q.huang638d5872025-06-21 13:44:43 +08002426 cell_info->lteMode_valid = 1;
2427 cell_info->lteMode =(!(cell->value12));
2428
2429
2430 cell_info->rsrp = rsrp_convert_to_minus_dBm(cell->value8);
2431 cell_info->rsrp_valid = (cell_info->rsrp!=INT_32_MAX);
2432
2433 cell_info->rsrq = rsrq_convert_to_minus_dB(cell->value9);
2434 cell_info->rsrq_valid = (cell_info->rsrq!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002435
2436 cell_info->cell_id_valid = 1;
2437 cell_info->cell_id = cell->value10;
2438
q.huang638d5872025-06-21 13:44:43 +08002439 cell_info->rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->rsrp);
2440 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
2441
b.liu68a94c92025-05-24 12:53:41 +08002442 break;
2443 }
2444
2445 default:
2446 break;
2447 }
2448 }
q.huang638d5872025-06-21 13:44:43 +08002449 int neibor_count = 0;
b.liu68a94c92025-05-24 12:53:41 +08002450 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2451 {
2452 switch(type)
2453 {
2454 //GSM
2455 case 0:
2456 {
2457
2458 }
2459 //WCDMA
2460 case 1:
2461 {
q.huang934ec0e2025-07-22 19:56:59 +08002462 LOGE(GSW_NW,"CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
b.liu68a94c92025-05-24 12:53:41 +08002463
2464 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2465
2466 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2467 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2468
2469 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2470 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2471
2472 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2473
2474 neibor_count++;
2475
2476 }
2477 //LTE
2478 case 2:
2479 {
q.huang934ec0e2025-07-22 19:56:59 +08002480 LOGE(GSW_NW,"CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
b.liu68a94c92025-05-24 12:53:41 +08002481 char lte_temp[12] = {0};
2482 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2483
q.huangdaa16d42025-07-03 14:32:48 +08002484
b.liu68a94c92025-05-24 12:53:41 +08002485 cell_info->ext_info[neibor_count].pci = cell->value1;
2486 cell_info->ext_info[neibor_count].pci_valid = 1;
2487
2488 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2489 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2490
q.huang638d5872025-06-21 13:44:43 +08002491 cell_info->ext_info[neibor_count].rsrp = rsrp_convert_to_minus_dBm(cell->value3);
2492 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 +08002493
q.huang638d5872025-06-21 13:44:43 +08002494 cell_info->ext_info[neibor_count].rsrq = rsrq_convert_to_minus_dB(cell->value4);
2495 cell_info->ext_info[neibor_count].rsrq_valid = (cell_info->ext_info[neibor_count].rsrq!=INT_32_MAX);
2496
2497 if(cell->value7!=INT_32_MAX)
2498 {
2499 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2500 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2501
2502 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2503 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 +08002504
b.liu68a94c92025-05-24 12:53:41 +08002505
q.huang638d5872025-06-21 13:44:43 +08002506 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2507 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mnc));
2508
2509
2510 //value 8 is tac
b.liu68a94c92025-05-24 12:53:41 +08002511
q.huang638d5872025-06-21 13:44:43 +08002512 cell_info->ext_info[neibor_count].band = cell->value9;
2513 cell_info->ext_info[neibor_count].band_valid = 1;
2514
2515 cell_info->ext_info[neibor_count].rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->ext_info[neibor_count].rsrp);
2516 cell_info->ext_info[neibor_count].rssi_valid = (cell_info->ext_info[neibor_count].rssi!=INT_32_MAX);
2517 }
b.liu68a94c92025-05-24 12:53:41 +08002518
2519 neibor_count++;
2520 }
2521
2522 default:
2523 break;
2524 }
2525 }
q.huang638d5872025-06-21 13:44:43 +08002526 cell_info->ext_info_len=neibor_count;
b.liu68a94c92025-05-24 12:53:41 +08002527 }
2528 list_free(cell_list);
2529
2530 return GSW_HAL_SUCCESS;
2531}
2532
2533/*
2534 * @brief set modem status event callback
2535 @param [in] handle_ptr callback function address
2536 @retval 0: success
2537 @retval 0: other: fail
2538 */
2539int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2540{
2541
2542 if (nw_init_flag == 0 || nw_info_handle == NULL)
2543 {
xy.heb41615b2025-05-28 16:33:20 +08002544 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002545 }
2546
b.liu68a94c92025-05-24 12:53:41 +08002547 if(handle_ptr == NULL)
2548 {
q.huang934ec0e2025-07-22 19:56:59 +08002549 LOGE(GSW_NW,"reg modem state cb, handle_ptr is NULL\n");
b.liu68a94c92025-05-24 12:53:41 +08002550 }
2551
2552 modem_cb = handle_ptr;
2553
b.liu68a94c92025-05-24 12:53:41 +08002554 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08002555}
2556
2557
2558/*
2559 * @brief get PLMNs from the FPLMN list
2560 * @param [inout] plmn_list:
2561 * @retval 0: success
2562 * @retval other: fail
2563 */
2564int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2565{
2566 if (nw_init_flag == 0 || nw_info_handle == NULL)
2567 {
xy.heb41615b2025-05-28 16:33:20 +08002568 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002569 }
2570
2571 int ret = -1;
2572 char fplmn[256] = {0};
q.huang934ec0e2025-07-22 19:56:59 +08002573 LOGE(GSW_NW,"mbtk_fplmn_get enter\n");
b.liu68a94c92025-05-24 12:53:41 +08002574 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
q.huang934ec0e2025-07-22 19:56:59 +08002575 LOGE(GSW_NW,"mbtk_fplmn_get exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002576 if(ret != 0)
2577 {
q.huang934ec0e2025-07-22 19:56:59 +08002578 LOGE(GSW_NW,"mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002579 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002580 }
2581
2582 update_fplmn_list(fplmn);
2583 for(int i = 0; i < fplmn_index; i++)
2584 {
2585 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2586 {
2587 continue;
2588 }
2589 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);
q.huang934ec0e2025-07-22 19:56:59 +08002590 LOGE(GSW_NW,"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);
b.liu68a94c92025-05-24 12:53:41 +08002591 plmn_list->plmn_list_len++;
2592 }
2593
q.huang934ec0e2025-07-22 19:56:59 +08002594 LOGE(GSW_NW,"fplmn = %s\n", fplmn);
b.liu68a94c92025-05-24 12:53:41 +08002595 return GSW_HAL_SUCCESS;
2596}
2597
2598/*
2599 * @brief add PLMNs from the plmn_list to the FPLMN list
2600 * @param [in] plmn_list:
2601 * @retval 0: success
2602 * @retval other: fail
2603 */
2604int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2605{
2606
2607 if (nw_init_flag == 0 || nw_info_handle == NULL)
2608 {
xy.heb41615b2025-05-28 16:33:20 +08002609 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002610 }
2611
2612 if(plmn_list->plmn_list_len >= fplmn_max_length)
2613 {
q.huang934ec0e2025-07-22 19:56:59 +08002614 LOGE(GSW_NW,"can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002615 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002616 }
2617
2618 int i = 0;
2619 int index = -1;
2620
2621 for(i = 0; i < plmn_list->plmn_list_len; i++)
2622 {
2623 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2624
2625 if(index == -1)
2626 {
q.huang934ec0e2025-07-22 19:56:59 +08002627 LOGE(GSW_NW,"no this PLMN, add it\n");
b.liu68a94c92025-05-24 12:53:41 +08002628 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2629 {
q.huang934ec0e2025-07-22 19:56:59 +08002630 LOGE(GSW_NW,"can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002631 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002632 }
2633
2634 else
2635 {
2636 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2637 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2638 fplmn_array[fplmn_index][5] = '\0';
q.huang934ec0e2025-07-22 19:56:59 +08002639 LOGE(GSW_NW,"fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
b.liu68a94c92025-05-24 12:53:41 +08002640 fplmn_index++;
2641 }
2642 }
2643
2644 else
2645 {
q.huang934ec0e2025-07-22 19:56:59 +08002646 LOGE(GSW_NW,"already have this PLMN, don't add it\n");
b.liu68a94c92025-05-24 12:53:41 +08002647 }
2648 }
2649
2650 char fplmn_str[256] = {0};
2651 convert_plmn_to_fplmn_str(fplmn_str);
2652
q.huang934ec0e2025-07-22 19:56:59 +08002653 LOGE(GSW_NW,"fplmn_str = %s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002654
2655 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2656 if(ret != 0)
2657 {
q.huang934ec0e2025-07-22 19:56:59 +08002658 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002659 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002660 }
2661
q.huang934ec0e2025-07-22 19:56:59 +08002662 LOGE(GSW_NW,"gsw_add_forbidden_networks exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002663 return GSW_HAL_SUCCESS;
2664}
2665
2666/*
2667 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2668 * @param [in] plmn_list:
2669 * @retval 0: success
2670 * @retval other: fail
2671 */
2672int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2673{
b.liu68a94c92025-05-24 12:53:41 +08002674 if (nw_init_flag == 0 || nw_info_handle == NULL)
2675 {
q.huangfa0a0a32025-06-12 17:07:23 +08002676 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002677 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002678 }
2679
2680 int i = 0;
2681 int index = -1;
2682
2683 for(i = 0; i < plmn_list->plmn_list_len; i++)
2684 {
2685 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2686 if(index != -1)
2687 {
2688 remove_fplmn(index);
2689 }
2690 else
2691 {
q.huang934ec0e2025-07-22 19:56:59 +08002692 LOGE(GSW_NW,"no this PLMN, can't remove it\n");
b.liu68a94c92025-05-24 12:53:41 +08002693 }
2694 }
2695
2696 for(i = 0; i < fplmn_index; i++)
2697 {
q.huang934ec0e2025-07-22 19:56:59 +08002698 LOGE(GSW_NW,"fplmn_array[%d] = %s\n", i, fplmn_array[i]);
b.liu68a94c92025-05-24 12:53:41 +08002699 }
2700
2701 char fplmn_str[256] = {0};
2702 convert_plmn_to_fplmn_str(fplmn_str);
q.huang934ec0e2025-07-22 19:56:59 +08002703 LOGE(GSW_NW,"fplmn_str = %s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002704
2705 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2706 if(ret != 0)
2707 {
q.huang934ec0e2025-07-22 19:56:59 +08002708 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002709 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002710 }
2711
q.huang934ec0e2025-07-22 19:56:59 +08002712 LOGE(GSW_NW,"gsw_remove_forbidden_networks exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002713 return GSW_HAL_SUCCESS;
2714}
2715
2716/*
2717 * @brief clear FPLMN list
2718 * @param
2719 * @retval 0: success
2720 * @retval other: fail
2721 */
2722int gsw_clear_forbidden_networks(void)
2723{
2724 if (nw_init_flag == 0 || nw_info_handle == NULL)
2725 {
xy.heb41615b2025-05-28 16:33:20 +08002726 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002727 }
2728
2729 char fplmn_str[FPLMN_STRING_LENGTH+1];
2730 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2731 fplmn_str[(6 * fplmn_max_length)] = '\0';
2732
q.huang934ec0e2025-07-22 19:56:59 +08002733 LOGE(GSW_NW,"%s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002734 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2735 if(ret != 0)
2736 {
q.huang934ec0e2025-07-22 19:56:59 +08002737 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002738 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002739 }
2740
2741 return GSW_HAL_SUCCESS;
2742}
2743
2744/*
2745 * @brief get oos config
2746 * @param [in] oos_config
2747 * @retval 0: success
2748 * @retval other: fail
2749 */
2750int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2751{
2752 if (nw_init_flag == 0 || nw_info_handle == NULL)
2753 {
xy.heb41615b2025-05-28 16:33:20 +08002754 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002755 }
2756
2757 if(pt_info == NULL)
2758 {
q.huang934ec0e2025-07-22 19:56:59 +08002759 LOGE(GSW_NW,"pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002760 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002761 }
2762
2763 int ret = -1;
2764
2765 mbtk_oos_info oos_info;
2766 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2767
2768 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2769 if(ret != 0)
2770 {
q.huang934ec0e2025-07-22 19:56:59 +08002771 LOGE(GSW_NW,"mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002772 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002773 }
2774
2775 if(oos_info.mode == 0)
2776 {
2777 pt_info->t_min = 0;
2778 pt_info->t_step = 0;
2779 pt_info->t_max = 0;
2780 }
2781
2782 else
2783 {
2784 pt_info->t_min = (int)oos_info.oosPhase[0];
2785 pt_info->t_step = (int)oos_info.oosPhase[1];
2786 pt_info->t_max = (int)oos_info.oosPhase[2];
2787 }
2788
2789 return GSW_HAL_SUCCESS;
2790}
2791
2792
2793/*
2794 * @brief set oos config
2795 * @param [in] oos_config
2796 * @retval 0: success
2797 * @retval other: fail
2798 */
2799int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2800{
2801 if (nw_init_flag == 0 || nw_info_handle == NULL)
2802 {
xy.heb41615b2025-05-28 16:33:20 +08002803 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002804 }
2805
2806 if(pt_info == NULL)
2807 {
q.huang934ec0e2025-07-22 19:56:59 +08002808 LOGE(GSW_NW,"pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002809 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002810 }
2811
2812 int ret = -1;
2813 mbtk_oos_info oos_info;
2814 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2815
2816 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2817 {
q.huang934ec0e2025-07-22 19:56:59 +08002818 LOGE(GSW_NW,"gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002819 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002820 }
2821 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2822 {
2823 oos_info.mode = 1;
2824 oos_info.oosPhase[0] = pt_info->t_min;
2825 }
2826 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)
2827 {
2828 oos_info.mode = 1;
2829 oos_info.oosPhase[0] = pt_info->t_min;
2830 oos_info.oosPhase[1] = pt_info->t_step;
2831 }
2832 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))
2833 {
2834 oos_info.mode = 1;
2835 oos_info.oosPhase[0] = pt_info->t_min;
2836 oos_info.oosPhase[1] = pt_info->t_step;
2837 oos_info.oosPhase[2] = pt_info->t_max;
2838 }
2839 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2840 {
2841 oos_info.mode = 0;
2842 }
2843 else
2844 {
q.huang934ec0e2025-07-22 19:56:59 +08002845 LOGE(GSW_NW,"gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002846 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002847 }
2848
2849 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2850 if(ret != 0)
2851 {
q.huang934ec0e2025-07-22 19:56:59 +08002852 LOGE(GSW_NW,"mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002853 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002854 }
2855
2856 return GSW_HAL_SUCCESS;
2857}
2858
q.huang238b22a2025-06-10 14:36:59 +08002859/**
2860 * @brief get imei function
2861 * @param [in] len imei length,max is 20
2862 * @param [out] imei return imei from this func
2863 * @retval 0: success
2864 * @retval other: fail
2865 */
2866int gsw_get_imei(int len, char *imei)
2867{
q.huang238b22a2025-06-10 14:36:59 +08002868 if (nw_init_flag == 0 || nw_info_handle == NULL)
2869 {
2870 printf("nw sdk has been deinit\n");
2871 return GSW_HAL_NORMAL_FAIL;
2872 }
2873
2874 if(imei == NULL)
2875 {
q.huang934ec0e2025-07-22 19:56:59 +08002876 LOGE(GSW_NW,"imei is NULL.");
q.huang238b22a2025-06-10 14:36:59 +08002877 return GSW_HAL_ARG_INVALID;
2878 }
2879
2880 if(len < GSW_IMEI_LENGTH)
2881 {
q.huang934ec0e2025-07-22 19:56:59 +08002882 LOGE(GSW_NW,"imei len is too short,len = %d\n", len);
q.huang238b22a2025-06-10 14:36:59 +08002883 return GSW_HAL_NORMAL_FAIL;
2884 }
2885
q.huang861c07d2025-06-24 16:54:58 +08002886 int ret = mbtk_imei_get(nw_info_handle, (void *)imei);
q.huang238b22a2025-06-10 14:36:59 +08002887 if(ret != MBTK_ERR_OK)
2888 {
q.huang934ec0e2025-07-22 19:56:59 +08002889 LOGE(GSW_NW,"[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002890 return GSW_HAL_NORMAL_FAIL;
2891 }
2892
2893 return GSW_HAL_SUCCESS;
2894}
2895
2896/**
2897 * @brief reset modem stack only, notice: after use this method, all ril sdk
2898 * need restart by app, means network, sim, sms, data need deinit then init!
2899 * @param
2900 * @retval 0: success
2901 * @retval other: fail
2902 */
2903int gsw_reset_modem(void)
2904{
2905 int ret = -1;
2906 if (nw_init_flag == 0 || nw_info_handle == NULL)
2907 {
2908 printf("nw sdk has been deinit\n");
2909 return GSW_HAL_NORMAL_FAIL;
2910 }
2911 mbtk_modem_info_t info;
2912 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2913 info.rst = 0;
2914
2915 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2916 if(ret)
2917 {
q.huang934ec0e2025-07-22 19:56:59 +08002918 LOGE(GSW_NW,"[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002919 return GSW_HAL_NORMAL_FAIL;
2920 }
2921
2922 sleep(1);
2923
2924 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2925 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2926 if(ret)
2927 {
q.huang934ec0e2025-07-22 19:56:59 +08002928 LOGE(GSW_NW,"[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002929 return GSW_HAL_NORMAL_FAIL;
2930 }
2931 return GSW_HAL_SUCCESS;
2932}
b.liu68a94c92025-05-24 12:53:41 +08002933
q.huangc8b93122025-06-17 17:46:05 +08002934int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2935{
2936 if (nw_init_flag == 0 || nw_info_handle == NULL)
2937 {
2938 return GSW_HAL_NORMAL_FAIL;
2939 }
q.huang934ec0e2025-07-22 19:56:59 +08002940
2941 void* cb_func;
q.huangc8b93122025-06-17 17:46:05 +08002942 if(handle_ptr == NULL)
2943 {
q.huang934ec0e2025-07-22 19:56:59 +08002944 LOGE(GSW_NW,"reg airplane mode cb is NULL");
2945 cb_func=NULL;
q.huangc8b93122025-06-17 17:46:05 +08002946 }
q.huang934ec0e2025-07-22 19:56:59 +08002947 else
2948 {
2949 cb_func=(void*) gsw_operating_mode_event_callback;
q.huangc8b93122025-06-17 17:46:05 +08002950 }
q.huangc8b93122025-06-17 17:46:05 +08002951
q.huang934ec0e2025-07-22 19:56:59 +08002952 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle, cb_func);
2953
2954 if (ret != 0)
2955 {
2956 LOGE(GSW_NW,"mbtk_radio_state_change_cb_reg fail, ret is %d",ret);
2957 return GSW_HAL_NORMAL_FAIL;
2958 }
2959
2960 airplane_cb = handle_ptr;
2961
2962 if(airplane_cb !=NULL)
2963 {
2964 int opmode;
2965 ret = gsw_get_opmode(&opmode);
2966 if(ret == 0)
2967 {
2968 airplane_cb(opmode);
2969 }
2970 else
2971 {
2972 LOGE(GSW_NW,"gsw_get_opmode fail, ret is%d", ret);
2973 }
2974 }
2975
2976 return GSW_HAL_SUCCESS;
q.huangc8b93122025-06-17 17:46:05 +08002977}
2978
hong.liud2417072025-06-27 07:10:37 -07002979int gsw_get_apn_reserved_id(const char *apn)
2980{
2981 return 0;
2982}
2983
2984int gsw_set_apn_reserved_id(int reserved_id, const char *apn)
2985{
2986 return 0;
2987}
2988
2989int gsw_data_call_clear_session(int linkid, Link_Info_s *LinkInf)
2990{
2991 return 0;
2992}
2993
2994void *gsw_onUnsolicited(void *arg)
2995{
2996 return 0;
2997}
2998
2999int gsw_sdk_init(void)
3000{
3001 return 0;
3002}
3003
3004int gsw_get_modem_state_exp(void)
3005{
3006 return 0;
3007}