blob: beb811cb245dca1208f47e71a0e2ed3759c2eef2 [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
q.huang81905ea2025-07-25 20:19:41 +0800406#define NW_THEAD_NUM (3)
407
b.liu68a94c92025-05-24 12:53:41 +0800408static int mbtk_nw_api_import()
409{
410 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
411 if (dlHandle_mbtk == NULL)
412 {
xy.heb41615b2025-05-28 16:33:20 +0800413 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800414 }
q.huang934ec0e2025-07-22 19:56:59 +0800415
b.liu68a94c92025-05-24 12:53:41 +0800416 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
417 if (mbtk_info_handle_get == NULL)
418 {
q.huang934ec0e2025-07-22 19:56:59 +0800419 LOGE(GSW_NW,"mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800420 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800421 }
422
423 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
424 if (mbtk_info_handle_free == NULL)
425 {
q.huang934ec0e2025-07-22 19:56:59 +0800426 LOGE(GSW_NW,"mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800427 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800428 }
429
430 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
431 if (mbtk_net_sel_mode_get == NULL)
432 {
q.huang934ec0e2025-07-22 19:56:59 +0800433 LOGE(GSW_NW,"mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800434 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800435 }
436
437 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
438 if (mbtk_net_reg_get == NULL)
439 {
q.huang934ec0e2025-07-22 19:56:59 +0800440 LOGE(GSW_NW,"mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800441 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800442 }
443
444 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
445 if (mbtk_get_modem_fun == NULL)
446 {
q.huang934ec0e2025-07-22 19:56:59 +0800447 LOGE(GSW_NW,"mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800448 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800449 }
450
451 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
452 if (mbtk_set_modem_fun == NULL)
453 {
q.huang934ec0e2025-07-22 19:56:59 +0800454 LOGE(GSW_NW,"mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800455 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800456 }
457
458 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
459 if (mbtk_current_band_get == NULL)
460 {
q.huang934ec0e2025-07-22 19:56:59 +0800461 LOGE(GSW_NW,"mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800462 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800463 }
464
465 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
466 if (mbtk_current_band_set == NULL)
467 {
q.huang934ec0e2025-07-22 19:56:59 +0800468 LOGE(GSW_NW,"mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800469 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800470 }
471
472 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
473 if (mbtk_net_signal_get == NULL)
474 {
q.huang934ec0e2025-07-22 19:56:59 +0800475 LOGE(GSW_NW,"mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800476 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800477 }
478
479 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
480 if (mbtk_wakeup_state_set == NULL)
481 {
q.huang934ec0e2025-07-22 19:56:59 +0800482 LOGE(GSW_NW,"mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800483 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800484 }
485
486 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");
487 if (mbtk_cell_get == NULL)
488 {
q.huang934ec0e2025-07-22 19:56:59 +0800489 LOGE(GSW_NW,"mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800490 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800491 }
492
493 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");
494 if (mbtk_signal_state_change_cb_reg == NULL)
495 {
q.huang934ec0e2025-07-22 19:56:59 +0800496 LOGE(GSW_NW,"mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800497 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800498 }
499
500 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");
501 if (mbtk_net_state_change_cb_reg == NULL)
502 {
q.huang934ec0e2025-07-22 19:56:59 +0800503 LOGE(GSW_NW,"mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800504 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800505 }
506
507 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
508 if (mbtk_fplmn_get == NULL)
509 {
q.huang934ec0e2025-07-22 19:56:59 +0800510 LOGE(GSW_NW,"mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800511 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800512 }
513
514 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
515 if (mbtk_fplmn_set == NULL)
516 {
q.huang934ec0e2025-07-22 19:56:59 +0800517 LOGE(GSW_NW,"mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800518 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800519 }
520
521 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");
522 if (mbtk_radio_state_change_cb_reg == NULL)
523 {
q.huang934ec0e2025-07-22 19:56:59 +0800524 LOGE(GSW_NW,"mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800525 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800526 }
527
528 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
529 if (mbtk_oos_get == NULL)
530 {
q.huang934ec0e2025-07-22 19:56:59 +0800531 LOGE(GSW_NW,"mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800532 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800533 }
534
535 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
536 if (mbtk_oos_set == NULL)
537 {
q.huang934ec0e2025-07-22 19:56:59 +0800538 LOGE(GSW_NW,"mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800539 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800540 }
q.huang238b22a2025-06-10 14:36:59 +0800541
542 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
543 if (mbtk_imei_get == NULL)
544 {
q.huang934ec0e2025-07-22 19:56:59 +0800545 LOGE(GSW_NW,"mbtk_imei_get dlsym fail\n");
q.huang238b22a2025-06-10 14:36:59 +0800546 return GSW_HAL_NORMAL_FAIL;
547 }
q.huangdaa16d42025-07-03 14:32:48 +0800548
549 str_empty = (bool (*)(const void *str))dlsym(dlHandle_mbtk, "str_empty");
550 if (str_empty == NULL)
551 {
q.huang934ec0e2025-07-22 19:56:59 +0800552 LOGE(GSW_NW,"str_empty dlsym fail\n");
q.huangdaa16d42025-07-03 14:32:48 +0800553 return GSW_HAL_NORMAL_FAIL;
554 }
b.liu68a94c92025-05-24 12:53:41 +0800555
556 return GSW_HAL_SUCCESS;
557}
558
559void list_first(list_node_t *list)
560{
561 if (list) {
562 list->cur_index = 0;
563 list->cur_array_data = list->array_data.next;
564 }
565}
566
567void* list_next(list_node_t *list)
568{
569 if (list) {
570 list_arraynode_t *node = list->cur_array_data;
571 if (node) {
q.huang934ec0e2025-07-22 19:56:59 +0800572 LOGE(GSW_NW,"node is not null\n");
b.liu68a94c92025-05-24 12:53:41 +0800573 list->cur_array_data = list->cur_array_data->next;
574 list->cur_index++;
575 return node->data;
576 } else {
q.huang934ec0e2025-07-22 19:56:59 +0800577 LOGE(GSW_NW,"node is null\n");
b.liu68a94c92025-05-24 12:53:41 +0800578 return NULL;
579 }
580 } else {
q.huang934ec0e2025-07-22 19:56:59 +0800581 LOGE(GSW_NW,"list is null\n");
b.liu68a94c92025-05-24 12:53:41 +0800582 return NULL;
583 }
584}
585
586void list_free(list_node_t *list)
587{
588 if (list) {
589 list_arraynode_t *node = &(list->array_data); // Head node
590 list_arraynode_t *node_temp = NULL;
591 while (node->next) {
592 node_temp = node->next;
593 node->next = node->next->next;
594
595 if (list->free_func) {
596 list->free_func(node_temp->data);
597 } else {
598 free(node_temp->data);
599 }
600 free(node_temp);
601 }
602 free(list);
603 }
604}
605
q.huang861c07d2025-06-24 16:54:58 +0800606#if 0
q.huang638d5872025-06-21 13:44:43 +0800607static int32_t gsm_rssi_convert_to_dBm(uint8 rssi)
608{
609 if(rssi <= 31)
610 {
611 return rssi * 2 - 113; //0 map -113
612 //31 map -51
613 }
614 else
615 {
616 return INT_32_MAX;
617 }
618}
q.huang861c07d2025-06-24 16:54:58 +0800619#endif
q.huang638d5872025-06-21 13:44:43 +0800620
q.huangfa0a0a32025-06-12 17:07:23 +0800621static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
b.liu68a94c92025-05-24 12:53:41 +0800622{
q.huangfa0a0a32025-06-12 17:07:23 +0800623 if(rscp <= 96)
b.liu68a94c92025-05-24 12:53:41 +0800624 {
q.huangfa0a0a32025-06-12 17:07:23 +0800625 return 121-rscp; // 96 map 25
626 // 0 map -121, below -120
b.liu68a94c92025-05-24 12:53:41 +0800627 }
b.liu68a94c92025-05-24 12:53:41 +0800628 else
629 {
q.huangfa0a0a32025-06-12 17:07:23 +0800630 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800631 }
632}
633
q.huangfa0a0a32025-06-12 17:07:23 +0800634static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
b.liu68a94c92025-05-24 12:53:41 +0800635{
q.huangfa0a0a32025-06-12 17:07:23 +0800636 if(rsrp <= 97)
b.liu68a94c92025-05-24 12:53:41 +0800637 {
q.huangfa0a0a32025-06-12 17:07:23 +0800638 return 141-rsrp; // 97 map 44
639 // 0 map 141 below 140
b.liu68a94c92025-05-24 12:53:41 +0800640 }
641 else
642 {
q.huangfa0a0a32025-06-12 17:07:23 +0800643 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800644 }
645}
646
q.huangfa0a0a32025-06-12 17:07:23 +0800647static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
b.liu68a94c92025-05-24 12:53:41 +0800648{
q.huangfa0a0a32025-06-12 17:07:23 +0800649 if(rsrq <= 34)
b.liu68a94c92025-05-24 12:53:41 +0800650 {
q.huangfa0a0a32025-06-12 17:07:23 +0800651 return (40-rsrq)/2; //=20-rsrq / 2;
652 // 34 map 3
653 // 0 map 20
b.liu68a94c92025-05-24 12:53:41 +0800654 }
655 else
656 {
q.huangfa0a0a32025-06-12 17:07:23 +0800657 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800658 }
659}
660
q.huang861c07d2025-06-24 16:54:58 +0800661static int32_t sinr_convert_to_10_times_dB(int8 sinr)
q.huang638d5872025-06-21 13:44:43 +0800662{
663 if(sinr <=35 && sinr>=-20)
664 {
665 return sinr*10; //35 map 350 db
666 // -20 map -2000 db
667 }
668 else
669 {
670 return INT_32_MAX;
671 }
672}
673
674
675static int32_t rscp_minus_dbm_convert_to_rssi_dBm(int32_t rscp)
676{
677 if(rscp!=INT_32_MAX)
678 {
679 return -rscp;
680 }
681 else
682 {
683 return INT_32_MAX;
684 }
685}
686
687static int32_t rsrp_minus_dbm_convert_to_rssi_dBm(int32_t rsrp)
688{
689 if(rsrp!=INT_32_MAX)
690 {
691 return -rsrp;
692 }
693 else
694 {
695 return INT_32_MAX;
696 }
697}
698
q.huang861c07d2025-06-24 16:54:58 +0800699static int32_t rxlev_convert_to_rssi_dBm(uint8 rxlev)
700{
701 if(rxlev<=63)
702 {
703 return rxlev-111; //0 map -111, below -110
704 // 63 map -48
705 }
706 else
707 {
708 return INT_32_MAX;
709 }
710
711}
b.liu68a94c92025-05-24 12:53:41 +0800712
q.huangfa0a0a32025-06-12 17:07:23 +0800713//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
714// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
715// * will be 125.*/
716//uint8 ecno; // 0: Ec/Io < -24 dB
717 // 1: -24 dB �� Ec/Io < -23.5 dB
718 // 2: -23.5 dB �� Ec/Io < -23 dB
719 // ......
720 // 47: -1 dB �� Ec/Io < -0.5 dB
721 // 48: -0.5 dB �� Ec/Io < 0 dB
722 // 49: 0 dB �� Ec/Io
723 // 255: not known or not detectabl
724static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
b.liu68a94c92025-05-24 12:53:41 +0800725{
q.huangfa0a0a32025-06-12 17:07:23 +0800726 if(ecno <=49)
b.liu68a94c92025-05-24 12:53:41 +0800727 {
q.huangfa0a0a32025-06-12 17:07:23 +0800728 return 245-ecno*5; //49 map 0 db
729 // 1 map 240 db
730 // 0 map 245 below 240
b.liu68a94c92025-05-24 12:53:41 +0800731 }
q.huangfa0a0a32025-06-12 17:07:23 +0800732 else
b.liu68a94c92025-05-24 12:53:41 +0800733 {
q.huangfa0a0a32025-06-12 17:07:23 +0800734 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800735 }
736}
737
b.liu68a94c92025-05-24 12:53:41 +0800738
b.liu68a94c92025-05-24 12:53:41 +0800739
q.huangfa0a0a32025-06-12 17:07:23 +0800740/* change realCsq to level */
741static int rscpToLevel(int rscp)
b.liu68a94c92025-05-24 12:53:41 +0800742{
q.huangfa0a0a32025-06-12 17:07:23 +0800743
744 if (rscp < -110) {
b.liu68a94c92025-05-24 12:53:41 +0800745 return 0;
q.huangfa0a0a32025-06-12 17:07:23 +0800746 } else if (rscp <= -95) {
747 return rscp+111; // to 16
748 } else if (rscp >=-93 && rscp <=-90) {
749 return rscp+110; // to 20
750 } else if (rscp >=-89 && rscp <=-59) {
751 return (rscp+152)/3; // =(rscp+89)/3+21 to 31
752 } else if (rscp ==- 94) { // Geely requirement, -94 map 16
753 return 16;
754 } else if(rscp <= -25) {
755 return 31;
b.liu68a94c92025-05-24 12:53:41 +0800756 }
q.huangfa0a0a32025-06-12 17:07:23 +0800757 return 99;
b.liu68a94c92025-05-24 12:53:41 +0800758}
759
q.huangfa0a0a32025-06-12 17:07:23 +0800760static int rsrpToLevel(int rsrp)
761{
762 if (rsrp < -130) {
763 return 0;
764 } else if (rsrp <= -118) {
765 return (rsrp+132)/2; // to 7
766 } else if (rsrp <=-109) {
767 return rsrp+125; // to 16
768 } else if (rsrp <=-103) {
769 return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
770 } else if (rsrp <=- 85) {
771 return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
772 } else if(rsrp <= -55) {
773 return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
774 } else if(rsrp <=-44)
775 {
776 return 31;
777 }
778 return 99;
779}
780
q.huang861c07d2025-06-24 16:54:58 +0800781//uint8 rssi; // 0: 113 dBm or less
782 // 1: 111 dBm
783 // 2��30: 109��53 dBm
784 // 31: 51 dBm or greater
785 // 99: not known or not detectable
786//uint8 rxlev;// 0:rssi < -110 dBm
787 // 1: -110 dBm �� rssi < -109 dBm
788 // 2: -109 dBm �� rssi < -108 dBm
789 // 60 ......
790 // 61: -50 dBm �� rssi < -49 dBm
791 // 62: -49 dBm �� rssi < -48 dBm
792 // 63: -48 dBm �� rssi
793 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +0800794
q.huang861c07d2025-06-24 16:54:58 +0800795/* change realCsq to level */
796static int rxlevToLevel(uint8 rxlev)
797{
798 if (rxlev <=60) {
799 return (rxlev+3)/2; // =(rxlev+1)/2+1,
800 // 0 map 1
801 // 1,2 map 2
802 // 59,60 map 31
803 }
804 else if(rxlev <=63)
805 {
806 return 31;
807 }
808 return 99;
809}
b.liu68a94c92025-05-24 12:53:41 +0800810
811static int convert_reg_state(int reg_state_t)
812{
q.huang934ec0e2025-07-22 19:56:59 +0800813 LOGD(GSW_NW,"reg_state_t = %d\n",reg_state_t);
b.liu68a94c92025-05-24 12:53:41 +0800814 int reg_state = 0;
815
816 switch (reg_state_t)
817 {
818 case MBTK_NET_REG_STATE_NON:
819 {
820 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
821 break;
822 }
823 case MBTK_NET_REG_STATE_HOME:
824 {
825 reg_state = GSW_NETWORK_REG_REGISTERED;
826 break;
827 }
828 case MBTK_NET_REG_STATE_SEARCHING:
829 {
830 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
831 break;
832 }
833 case MBTK_NET_REG_STATE_DENIED:
834 {
835 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
836 break;
837 }
838 case MBTK_NET_REG_STATE_UNKNOWN:
839 {
840 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
841 break;
842 }
843 case MBTK_NET_REG_STATE_ROAMING:
844 {
845 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
846 break;
847 }
848 case MBTK_NET_REG_STATE_SMS_ONLY:
849 case MBTK_NET_REG_STATE_ROAMING_SMS:
850 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
851 case MBTK_NET_REG_STATE_CSFB_HOME:
852 case MBTK_NET_REG_STATE_CSFB_ROAMING:
853 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
854 {
855 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
856 break;
857 }
858 }
859
860 return reg_state;
861}
862
863
864static int convert_net_mode(int net_mode)
865{
q.huang934ec0e2025-07-22 19:56:59 +0800866 LOGD(GSW_NW,"net_mode = %d\n",net_mode);
b.liu68a94c92025-05-24 12:53:41 +0800867 switch(net_mode)
868 {
869 case MBTK_RADIO_TECH_GSM:
870 case MBTK_RADIO_TECH_GSM_COMPACT:
871 case MBTK_RADIO_TECH_GSM_EGPRS:
872 {
873 return GSW_NETWORK_RADIO_GSM;
874 }
875 case MBTK_RADIO_TECH_UTRAN:
876 case MBTK_RADIO_TECH_UTRAN_HSDPA:
877 case MBTK_RADIO_TECH_UTRAN_HSUPA:
878 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
879 case MBTK_RADIO_TECH_UTRAN_HSPA:
880 {
881 return GSW_NETWORK_RADIO_UMTS;
882 }
883 case MBTK_RADIO_TECH_E_UTRAN:
884 {
885 return GSW_NETWORK_RADIO_LTE;
886 }
887
888 default:
889 {
890 return GSW_NETWORK_RADIO_NO_SVC;
891 }
892 }
893
894 return GSW_NETWORK_RADIO_NO_SVC;
895}
896
897static int convert_mbtk_net_config(int config)
898{
899 int net_pref = -1;
900
901 switch(config)
902 {
903 case GSW_PREFER_MODE_GSW:
904 {
905 net_pref = 0;
906 break;
907 }
908
909 case GSW_PREFER_MODE_WCDMA:
910 {
911 net_pref = 1;
912 break;
913 }
914
915 case GSW_PREFER_MODE_WCDMA_GSM:
916 {
917 net_pref = 2;
918 break;
919 }
920
921 case GSW_PREFER_MODE_LTE:
922 case GSW_PREFER_MODE_NR5G:
923 case GSW_PREFER_MODE_NR5G_LTE:
924 {
925 net_pref = 5;
926 break;
927 }
928
929 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
930 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
931 {
932 net_pref = 15;
933 break;
934 }
935 }
936
937 return net_pref;
938}
939
940
941static int convert_gsw_net_config(int config)
942{
943 int net_config = -1;
q.huang934ec0e2025-07-22 19:56:59 +0800944 LOGD(GSW_NW,"config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +0800945
946 switch (config)
947 {
948 case 0:
949 {
950 net_config = GSW_PREFER_MODE_GSW;
951 break;
952 }
953
954 case 1:
955 {
956 net_config = GSW_PREFER_MODE_WCDMA;
957 break;
958 }
959
960 case 2:
961 {
962 net_config = GSW_PREFER_MODE_WCDMA_GSM;
963 break;
964 }
965
966 case 5:
967 {
968 net_config = GSW_PREFER_MODE_LTE;
969 break;
970 }
971
972 case 15:
973 {
974 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
975 break;
976 }
977 }
978
979 return net_config;
980}
981
982//64F010 -> 46001 (64->46,F0->0,10->01)
983static void transform_fplmn_str_to_plmn(char *entry)
984{
985 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
986 return; //if FFFFFF,means invalid fplmn, do nothing
987 }
988
989 char temp = entry[0];
990 entry[0] = entry[1];
991 entry[1] = temp;
992
993 temp = entry[ENTRY_LENGTH - 2];
994 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
995 entry[ENTRY_LENGTH - 1] = temp;
996
997 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
998
q.huang934ec0e2025-07-22 19:56:59 +0800999 LOGE(GSW_NW,"after transform_fplmn_str_to_plmn: %s\n", entry);
b.liu68a94c92025-05-24 12:53:41 +08001000
1001 //valid fplmn
1002 fplmn_index++;
1003}
1004
1005static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
1006{
1007 strncpy(mcc,entry,3);
1008 mcc[3] = '\0';
1009 strncpy(mnc,entry + 3,2);
1010 mnc[2] = '\0';
1011
q.huang934ec0e2025-07-22 19:56:59 +08001012 LOGE(GSW_NW,"entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
b.liu68a94c92025-05-24 12:53:41 +08001013}
1014
1015
1016static void update_fplmn_list(char *fplmn_str)
1017{
q.huang934ec0e2025-07-22 19:56:59 +08001018 LOGE(GSW_NW,"fplmn_str = %s\n",fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08001019 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
1020 memset(fplmn_array, 0, sizeof(fplmn_array));
1021 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
1022 fplmn_index = 0;
1023 int array_length = 0;
1024
1025 for (int i = 0; i < strlen(fplmn_str); i += 6) {
1026
1027 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
1028 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
1029 temp_fplmn_array[array_length][length] = '\0';
1030 array_length++;
1031 if (i + 6 >= strlen(fplmn_str)) {
1032 break;
1033 }
1034 }
1035
1036 for (int i = 0; i < array_length; i++) {
q.huang934ec0e2025-07-22 19:56:59 +08001037 LOGE(GSW_NW,"array[%d] = %s\n", i, temp_fplmn_array[i]);
b.liu68a94c92025-05-24 12:53:41 +08001038 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1039 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
q.huang934ec0e2025-07-22 19:56:59 +08001040 LOGE(GSW_NW,"fplmn_array[%d] = %s\n", i, fplmn_array[i]);
b.liu68a94c92025-05-24 12:53:41 +08001041 }
1042
1043}
1044
1045static void format_plmn(char *result, char *plmn_entry)
1046{
1047 strncpy(result, plmn_entry, strlen(plmn_entry));
q.huang934ec0e2025-07-22 19:56:59 +08001048 LOGE(GSW_NW,"result = %s, numStr = %s\n",result, plmn_entry);
b.liu68a94c92025-05-24 12:53:41 +08001049
1050 if (strlen(result) >= 2) {
1051 char temp = result[0];
1052 result[0] = result[1];
1053 result[1] = temp;
1054 }
1055
q.huang934ec0e2025-07-22 19:56:59 +08001056 LOGE(GSW_NW,"1.result = %s\n",result);
b.liu68a94c92025-05-24 12:53:41 +08001057
1058 if (strlen(result) >= 3) {
1059 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1060 result[2] = 'F';
1061 }
1062
q.huang934ec0e2025-07-22 19:56:59 +08001063 LOGE(GSW_NW,"2.result = %s\n",result);
b.liu68a94c92025-05-24 12:53:41 +08001064
1065 if (strlen(result) >= 2) {
1066 char temp = result[strlen(result) - 1];
1067 result[strlen(result) - 1] = result[strlen(result) - 2];
1068 result[strlen(result) - 2] = temp;
1069 }
1070
q.huang934ec0e2025-07-22 19:56:59 +08001071 LOGE(GSW_NW,"3.result = %s\n",result);
b.liu68a94c92025-05-24 12:53:41 +08001072}
1073
1074
1075static void convert_plmn_to_fplmn_str(char *fplmn_str)
1076{
1077 char temp_fplmn_str[128] = {0};
1078 char temp[20]; // 临时存储单个格式化后的数字
1079 int index = 0;
1080
1081 for (int i = 0; i < fplmn_index; i++) {
1082 memset(temp, 0x0, sizeof(temp));
1083 format_plmn(temp, fplmn_array[i]);
1084 strcat(temp_fplmn_str, temp);
1085 index += strlen(temp);
1086 }
1087
1088 while(index < (6 * fplmn_max_length))
1089 {
1090 temp_fplmn_str[index++] = 'F';
1091 }
1092
1093 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1094 if (index > (6 * fplmn_max_length)) {
1095 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1096 }
1097
q.huang934ec0e2025-07-22 19:56:59 +08001098 LOGE(GSW_NW,"%s\n", temp_fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08001099 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
q.huang934ec0e2025-07-22 19:56:59 +08001100 LOGE(GSW_NW,"fplmn_str = %s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08001101}
1102
1103static int check_index(char *mcc, char *mnc)
1104{
1105 int i = 0;
1106
1107 for(i = 0; i < fplmn_index; i++)
1108 {
1109 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1110 {
q.huang934ec0e2025-07-22 19:56:59 +08001111 LOGE(GSW_NW,"index = %d\n", i);
b.liu68a94c92025-05-24 12:53:41 +08001112 return i;
1113 }
1114 }
1115
q.huang934ec0e2025-07-22 19:56:59 +08001116 LOGE(GSW_NW,"not find\n");
b.liu68a94c92025-05-24 12:53:41 +08001117 return -1;
1118}
1119
1120static void remove_fplmn(int index)
1121{
1122 int write_index = 0;
1123 for (int i = 0; i < fplmn_index; i++) {
1124 if (i != index) {
1125 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1126 }
1127 }
1128 fplmn_index--;
1129}
1130
q.huangfa0a0a32025-06-12 17:07:23 +08001131static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
1132{
q.huang934ec0e2025-07-22 19:56:59 +08001133 LOGD(GSW_NW,"signal->type=%d", signal->type);
q.huangfa0a0a32025-06-12 17:07:23 +08001134 memset(sig_strength,0,sizeof (signalStrength_t));
1135 switch(signal->type)
1136 {
1137 case MBTK_RADIO_TECH_E_UTRAN:
1138 {
q.huang934ec0e2025-07-22 19:56:59 +08001139 LOGI(GSW_NW,"rsrp = %d",signal->rsrp);
q.huangfa0a0a32025-06-12 17:07:23 +08001140 sig_strength->lte_sig_valid = 1;
q.huangc8b93122025-06-17 17:46:05 +08001141 sig_strength->rsrp = rsrp_convert_to_minus_dBm(signal->rsrp);
1142 sig_strength->rsrq = rsrq_convert_to_minus_dB(signal->rsrq);
q.huang638d5872025-06-21 13:44:43 +08001143 sig_strength->rssi = rsrp_minus_dbm_convert_to_rssi_dBm(sig_strength->rsrp);
q.huang861c07d2025-06-24 16:54:58 +08001144 sig_strength->rssnr= sinr_convert_to_10_times_dB(signal->sinr);
q.huangfa0a0a32025-06-12 17:07:23 +08001145 break;
1146 }
1147 case MBTK_RADIO_TECH_UTRAN:
1148 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1149 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1150 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1151 case MBTK_RADIO_TECH_UTRAN_HSPA:
1152 {
q.huang934ec0e2025-07-22 19:56:59 +08001153 LOGI(GSW_NW,"rscp = %d",signal->rscp);
q.huangfa0a0a32025-06-12 17:07:23 +08001154 sig_strength->wcdma_sig_valid = 1;
1155 sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
1156 sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
q.huang638d5872025-06-21 13:44:43 +08001157 sig_strength->rssi = rscp_minus_dbm_convert_to_rssi_dBm(sig_strength->rscp);
q.huangfa0a0a32025-06-12 17:07:23 +08001158 break;
1159 }
1160 case MBTK_RADIO_TECH_GSM:
1161 case MBTK_RADIO_TECH_GSM_COMPACT:
1162 case MBTK_RADIO_TECH_GSM_EGPRS:
1163 {
q.huang934ec0e2025-07-22 19:56:59 +08001164 LOGI(GSW_NW,"g rxlev = %d",signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001165 sig_strength->gw_sig_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08001166 sig_strength->rssi = rxlev_convert_to_rssi_dBm(signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001167 break;
1168 }
1169 default:
1170 {
q.huang934ec0e2025-07-22 19:56:59 +08001171 LOGE(GSW_NW,"[%s] unknown reg type.[%d]", __func__, signal->type);
q.huangfa0a0a32025-06-12 17:07:23 +08001172 }
1173 }
1174
1175}
1176
q.huang66b79162025-06-27 17:45:34 +08001177/*
q.huang934ec0e2025-07-22 19:56:59 +08001178typedef enum{
1179 MBTK_READY_INIT = -1,
1180 MBTK_READY_SUCCESS,
1181 MBTK_READY_MODEM_FAIL,
1182 MBTK_READY_RESPONSE_FAIL,
1183 MBTK_READY_SOCKET_FAIL,
1184 MBTK_READY_RIL_FAIL
q.huang66b79162025-06-27 17:45:34 +08001185}mbtk_ready_status_type;
1186
q.huang934ec0e2025-07-22 19:56:59 +08001187typedef enum gsw_hal_nw_mode_state_type
1188{
1189 GSW_MODEM_STATE_UNKNOWN = 0,
1190 GSW_MODEM_STATE_ONLINE,
1191 GSW_MODEM_STATE_OFFLINE,
1192 GSW_SDK_STATE_SERVICE_DOWN,
1193 GSW_SDK_STATE_SERVICE_UP,// service down->up 需要routectl 重启
1194 GSW_SDK_STATE_GPS_DOWN,
1195 GSW_SDK_STATE_GPS_UP,
q.huang66b79162025-06-27 17:45:34 +08001196} gsw_mode_state_e;
1197
1198*/
1199
1200static void convert_uci_to_gsw_modem_state(int uci, int *state)
1201{
1202 switch(uci)
q.huangdaa16d42025-07-03 14:32:48 +08001203 {
q.huang66b79162025-06-27 17:45:34 +08001204 case MBTK_READY_SUCCESS:
1205 *state=GSW_MODEM_STATE_ONLINE;
1206 return;
1207 case MBTK_READY_INIT:
1208 *state=GSW_MODEM_STATE_UNKNOWN;
1209 return;
1210 }
1211 *state=GSW_MODEM_STATE_OFFLINE;
1212 return;
1213}
1214
b.liu68a94c92025-05-24 12:53:41 +08001215static void gsw_serving_info_callback_thread()
1216{
q.huang934ec0e2025-07-22 19:56:59 +08001217 GSW_NW_SERVING_INFO serving_info;
1218 int ret = gsw_get_nwinfo(&serving_info);
b.liu68a94c92025-05-24 12:53:41 +08001219 if(ret != 0)
1220 {
q.huang934ec0e2025-07-22 19:56:59 +08001221 LOGE(GSW_NW,"cb gsw_get_nwinfo failed");
b.liu68a94c92025-05-24 12:53:41 +08001222 return;
1223 }
1224
q.huang934ec0e2025-07-22 19:56:59 +08001225 if(serving_cb!=NULL)
b.liu68a94c92025-05-24 12:53:41 +08001226 {
q.huang934ec0e2025-07-22 19:56:59 +08001227 LOGE(GSW_NW,"serving cb called");
1228 serving_cb(serving_info);
1229 }
1230 else
1231 {
1232 LOGE(GSW_NW,"serving cb is NULL");
b.liu68a94c92025-05-24 12:53:41 +08001233 }
1234}
1235
1236static void gsw_serving_info_callback(const void* data, int data_len)
q.huang934ec0e2025-07-22 19:56:59 +08001237{
1238 if (nw_init_flag == 0)
b.liu68a94c92025-05-24 12:53:41 +08001239 {
q.huang934ec0e2025-07-22 19:56:59 +08001240 printf("%s, nw not init\n",__func__);
b.liu68a94c92025-05-24 12:53:41 +08001241 return;
1242 }
q.huang934ec0e2025-07-22 19:56:59 +08001243
1244 pthread_t thread;
1245 int ret=pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1246 if(ret==0)
1247 {
1248 pthread_detach(thread);
1249 }
1250 else
1251 {
1252 LOGE(GSW_NW,"create thread fail, ret is %d",ret);
1253 }
b.liu68a94c92025-05-24 12:53:41 +08001254}
1255
q.huang934ec0e2025-07-22 19:56:59 +08001256
q.huangfa0a0a32025-06-12 17:07:23 +08001257/*typedef struct
q.huang934ec0e2025-07-22 19:56:59 +08001258{
q.huangfa0a0a32025-06-12 17:07:23 +080012590 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
12601 uint8 rssi; // 0: 113 dBm or less
q.huang934ec0e2025-07-22 19:56:59 +08001261 // 1: 111 dBm
1262 // 2��30: 109��53 dBm
1263 // 31: 51 dBm or greater
1264 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012652 uint8 rxlev;// 0:rssi < -110 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001266 // 1: -110 dBm �� rssi < -109 dBm
1267 // 2: -109 dBm �� rssi < -108 dBm
1268 // ......
1269 // 61: -50 dBm �� rssi < -49 dBm
1270 // 62: -49 dBm �� rssi < -48 dBm
1271 // 63: -48 dBm �� rssi
1272 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012733 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 +08001274 // 99 not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012754 uint8 rscp; // 0: rscp < -120 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001276 // 1: -120 dBm �� rscp < -119 dBm
1277 // 2: -119 dBm �� rscp < -118 dBm
1278 // ......
1279 // 94: -27 dBm �� rscp < -26 dBm
1280 // 95: -26 dBm �� rscp < -25 dBm
1281 // 96: - 25 dBm �� rscp
1282 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012835 uint8 ecno; // 0: Ec/Io < -24 dB
q.huang934ec0e2025-07-22 19:56:59 +08001284 // 1: -24 dB �� Ec/Io < -23.5 dB
1285 // 2: -23.5 dB �� Ec/Io < -23 dB
1286 // ......
1287 // 47: -1 dB �� Ec/Io < -0.5 dB
1288 // 48: -0.5 dB �� Ec/Io < 0 dB
1289 // 49: 0 dB �� Ec/Io
1290 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012916 uint8 rsrq; // 0: rsrq < -19.5 dB
q.huang934ec0e2025-07-22 19:56:59 +08001292 // 1: -19.5 dB �� rsrq < -19 dB
1293 // 2: -19 dB �� rsrq < -18.5 dB
1294 // ......
1295 // 32: -4 dB �� rsrq < -3.5 dB
1296 // 33: -3.5 dB �� rsrq < -3 dB
1297 // 34: -3 dB �� rsrq
1298 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012997 uint8 rsrp; // 0: rsrp < -140 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001300 // 1: -140 dBm �� rsrp < -139 dBm
1301 // 2: -139 dBm �� rsrp < -138 dBm
1302 // ......
1303 // 95: -46 dBm �� rsrp < -45 dBm
1304 // 96: -45 dBm �� rsrp < -44 dBm
1305 // 97: -44 dBm �� rsrp
1306 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080013078 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
q.huang934ec0e2025-07-22 19:56:59 +08001308 // 1: -43 dB <= ss_rsrq < -42.5 dB
1309 // 2: -42.5 dB <= ss_rsrq < -42 dB
1310 // ......
1311 // 125: 19 dB <= ss_rsrq < 19.5 dB
1312 // 126: 19.5 dB <= ss_rsrq < 20 dB
1313 // 255: not known or not detectable
1314 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1315 // 1: -156 dBm <= ss_rsrp < -155 dBm
1316 // 2: -155 dBm <= ss_rsrp < -154 dBm
1317 // ......
1318 // 125: -32 dBm <= ss_rsrp < -31 dBm
1319 // 126: -31 dBm <= ss_rsrp
1320 // 255: not known or not detectable
1321 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1322 // 1: -23 dB  ss_sinr < -22.5 dB
1323 // 2: -22.5 dB  ss_sinr < -22 dB
1324 // ......
1325 // 125: 39 dB  ss_sinr < 39.5 dBm
1326 // 126: 39.5 dB  ss_sinr < 40 dB
1327 // 127: 40 dB  ss_sinr
1328 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +08001329} __attribute__((packed)) mbtk_signal_info_t;
1330*/
b.liu68a94c92025-05-24 12:53:41 +08001331static void gsw_sig_info_callback(const void* data, int data_len)
1332{
q.huang934ec0e2025-07-22 19:56:59 +08001333 if (nw_init_flag == 0)
1334 {
1335 printf("%s, nw not init\n",__func__);
1336 return;
1337 }
1338
q.huangfa0a0a32025-06-12 17:07:23 +08001339 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001340 {
b.liu68a94c92025-05-24 12:53:41 +08001341 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001342 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1343
b.liu68a94c92025-05-24 12:53:41 +08001344 if(sig_cb != NULL)
1345 {
1346 sig_cb(sig_strength);
1347 }
1348 }
b.liu68a94c92025-05-24 12:53:41 +08001349 else
1350 {
q.huang934ec0e2025-07-22 19:56:59 +08001351 LOGE(GSW_NW,"data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001352 }
1353}
1354
q.huangc8b93122025-06-17 17:46:05 +08001355static void gsw_operating_mode_event_callback(const void* data, int data_len)
b.liu68a94c92025-05-24 12:53:41 +08001356{
q.huang934ec0e2025-07-22 19:56:59 +08001357 if (nw_init_flag == 0)
1358 {
1359 printf("%s nw not init\n",__func__);
1360 return;
1361 }
1362
1363 LOGE(GSW_NW,"gsw_operating_mode_event_callback start\n");
b.liu68a94c92025-05-24 12:53:41 +08001364
q.huangc8b93122025-06-17 17:46:05 +08001365
b.liu68a94c92025-05-24 12:53:41 +08001366 if(data && data_len > 0)
1367 {
q.huangc8b93122025-06-17 17:46:05 +08001368 const uint8 *cfun_state = (const uint8*)data;
q.huang934ec0e2025-07-22 19:56:59 +08001369 LOGE(GSW_NW,"gsw_operating_mode_event_callback,data = %d\n", *cfun_state);
q.huangc8b93122025-06-17 17:46:05 +08001370 if(airplane_cb != NULL)
b.liu68a94c92025-05-24 12:53:41 +08001371 {
q.huangc8b93122025-06-17 17:46:05 +08001372 airplane_cb(*cfun_state);
b.liu68a94c92025-05-24 12:53:41 +08001373 }
1374 }
1375
1376}
1377
q.huangdaa16d42025-07-03 14:32:48 +08001378
b.liu68a94c92025-05-24 12:53:41 +08001379static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1380{
q.huang934ec0e2025-07-22 19:56:59 +08001381 if (nw_init_flag == 0)
1382 {
1383 printf("%s nw not init\n",__func__);
1384 return;
1385 }
b.liu68a94c92025-05-24 12:53:41 +08001386
q.huang934ec0e2025-07-22 19:56:59 +08001387 LOGE(GSW_NW,"gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
b.liu68a94c92025-05-24 12:53:41 +08001388
1389 if(reject_cb != NULL)
1390 {
q.huang934ec0e2025-07-22 19:56:59 +08001391 GSW_NW_REJ_CAUSE_E rej_cause;
1392 rej_cause.rej_cause = cause;
1393 rej_cause.rej_rat = rat;
1394 rej_cause.rej_domain = domain;
1395
1396 LOGE(GSW_NW,"reject_cb called\n");
1397 reject_cb(&rej_cause);
b.liu68a94c92025-05-24 12:53:41 +08001398 }
1399 else
1400 {
q.huang934ec0e2025-07-22 19:56:59 +08001401 LOGE(GSW_NW,"reject_cb is NULL\n");
1402 }
1403}
1404
1405void gsw_serving_info_timer()
1406{
1407 if(nw_init_flag == 0 || nw_info_handle == NULL)
1408 {
1409 return;
b.liu68a94c92025-05-24 12:53:41 +08001410 }
1411
q.huang934ec0e2025-07-22 19:56:59 +08001412 while(nw_init_flag)
1413 {
1414 gsw_serving_info_callback_thread();
1415 sleep(SERVING_TIMER);
1416 }
b.liu68a94c92025-05-24 12:53:41 +08001417}
1418
xy.hec89938f2025-05-29 14:08:47 +08001419void gsw_sig_info_timer()
1420{
xy.hec89938f2025-05-29 14:08:47 +08001421 if(nw_init_flag == 0 || nw_info_handle == NULL)
1422 {
1423 return;
1424 }
1425
1426 mbtk_signal_info_t signal;
1427 signalStrength_t sig_strength;
1428
1429 while(nw_init_flag)
1430 {
q.huangfa0a0a32025-06-12 17:07:23 +08001431 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001432 if(ret != 0)
1433 {
q.huang934ec0e2025-07-22 19:56:59 +08001434 LOGE(GSW_NW,"mbtk_net_signal_get fail, ret is %d\n",ret);
q.huang66b79162025-06-27 17:45:34 +08001435
xy.hec89938f2025-05-29 14:08:47 +08001436 }
xy.hec89938f2025-05-29 14:08:47 +08001437 else
1438 {
q.huangfa0a0a32025-06-12 17:07:23 +08001439 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
q.huang66b79162025-06-27 17:45:34 +08001440 if(sig_cb != NULL)
1441 {
1442 sig_cb(sig_strength);
1443 }
xy.hec89938f2025-05-29 14:08:47 +08001444 }
xy.hec89938f2025-05-29 14:08:47 +08001445 sleep(SIG_TIMER);
1446 }
1447}
1448
q.huangdaa16d42025-07-03 14:32:48 +08001449int get_sdk_ready()
1450{
1451 char buffer[MBTK_READY_STRING_SIZE_MAX];
1452 FILE *fp = popen(SDK_READY_CMD, "r");
1453 if(NULL == fp)
1454 {
q.huang934ec0e2025-07-22 19:56:59 +08001455 LOGE(GSW_NW,"popen sdk ready fail");
q.huangdaa16d42025-07-03 14:32:48 +08001456 return -1;
1457 }
1458 memset(buffer,0,sizeof(buffer));
1459 if(fgets(buffer, sizeof(buffer), fp) == NULL)
1460 {
1461 pclose(fp);
q.huang934ec0e2025-07-22 19:56:59 +08001462 LOGE(GSW_NW,"fgets failed:");
q.huangdaa16d42025-07-03 14:32:48 +08001463 return -1;
1464 }
1465 pclose(fp);
q.huang934ec0e2025-07-22 19:56:59 +08001466 LOGE(GSW_NW,"get_sdk_ready:%s",buffer);
q.huangdaa16d42025-07-03 14:32:48 +08001467 return atoi(buffer);
1468}
1469
q.huang66b79162025-06-27 17:45:34 +08001470int gsw_get_modem_state(int *state)
1471{
q.huangdaa16d42025-07-03 14:32:48 +08001472 int uci_value = get_sdk_ready();
1473 if(uci_value < 0)
q.huang66b79162025-06-27 17:45:34 +08001474 {
q.huangdaa16d42025-07-03 14:32:48 +08001475 return GSW_HAL_NORMAL_FAIL;
q.huang66b79162025-06-27 17:45:34 +08001476 }
q.huangdaa16d42025-07-03 14:32:48 +08001477 convert_uci_to_gsw_modem_state(uci_value,state);
1478 return GSW_HAL_SUCCESS;
q.huang66b79162025-06-27 17:45:34 +08001479}
1480
1481int g_mode_state=((int)(GSW_MODEM_STATE_UNKNOWN))-1;
1482void gsw_modem_state_timer()
1483{
1484 while(nw_init_flag)
1485 {
q.huangdaa16d42025-07-03 14:32:48 +08001486 int state;
1487 int ret = gsw_get_modem_state(&state);
q.huang66b79162025-06-27 17:45:34 +08001488 if(modem_cb != NULL)
1489 {
q.huang66b79162025-06-27 17:45:34 +08001490 if(ret != 0)
1491 {
q.huangdaa16d42025-07-03 14:32:48 +08001492 modem_cb(GSW_MODEM_STATE_UNKNOWN);
q.huang66b79162025-06-27 17:45:34 +08001493 }
1494 else if(state!=g_mode_state)
1495 {
q.huang934ec0e2025-07-22 19:56:59 +08001496 LOGE(GSW_NW,"modem state changed from %d to %d",g_mode_state,state);
q.huang66b79162025-06-27 17:45:34 +08001497 g_mode_state=state;
1498 modem_cb(state);
1499 }
1500 }
1501 sleep(MODEM_TIMER);
1502 }
1503}
1504
1505
b.liu68a94c92025-05-24 12:53:41 +08001506
1507/**
1508 * @brief SDK interface to call back serving info
1509 * @param [in] handle_ptr
1510 * @retval 0: success
1511 * @retval other: fail
1512 */
1513int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1514{
1515 if (nw_init_flag == 0 || nw_info_handle == NULL)
1516 {
xy.heb41615b2025-05-28 16:33:20 +08001517 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001518 }
1519
q.huang934ec0e2025-07-22 19:56:59 +08001520 void* cb_func;
b.liu68a94c92025-05-24 12:53:41 +08001521 if(handle_ptr == NULL)
1522 {
q.huang934ec0e2025-07-22 19:56:59 +08001523 LOGE(GSW_NW,"serving info handle_ptr is NULL\n");
1524 cb_func=NULL;
1525 }
1526 else
1527 {
1528 cb_func=(void*) gsw_serving_info_callback;
1529 }
1530
1531 int ret = mbtk_net_state_change_cb_reg(nw_info_handle, cb_func);
1532 if (ret != 0)
1533 {
1534 LOGW(GSW_NW,"mbtk_net_state_change_cb_reg fail, ret is %d",ret);
xy.heb41615b2025-05-28 16:33:20 +08001535 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001536 }
q.huang934ec0e2025-07-22 19:56:59 +08001537 serving_cb=handle_ptr;
b.liu68a94c92025-05-24 12:53:41 +08001538 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08001539}
1540
1541
1542/**
1543 * @brief SDK interface to call back sig info
1544 * @param [in] handle_ptr
1545 * @retval 0: success
1546 * @retval other: fail
1547 */
1548int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1549{
1550 if (nw_init_flag == 0 || nw_info_handle == NULL)
1551 {
xy.heb41615b2025-05-28 16:33:20 +08001552 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001553 }
q.huang81905ea2025-07-25 20:19:41 +08001554
q.huang934ec0e2025-07-22 19:56:59 +08001555 void* cb_func;
b.liu68a94c92025-05-24 12:53:41 +08001556 if(handle_ptr == NULL)
1557 {
q.huang934ec0e2025-07-22 19:56:59 +08001558 LOGE(GSW_NW,"serving info handle_ptr is NULL\n");
1559 cb_func=NULL;
1560 }
1561 else
1562 {
1563 cb_func=(void*) gsw_sig_info_callback;
1564 }
1565
1566 int ret = mbtk_signal_state_change_cb_reg(nw_info_handle, cb_func);
1567
1568 if (ret != 0)
1569 {
1570 LOGE(GSW_NW,"mbtk_signal_state_change_cb_reg fail, ret is %d", ret);
1571 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001572 }
1573
1574 sig_cb = handle_ptr;
1575
1576 return GSW_HAL_SUCCESS;
1577
1578}
1579
1580
1581/**
1582 * @brief SDK interface to call back rej cause
1583 * @param [in] handle_ptr
1584 * @retval 0: success
1585 * @retval other: fail
1586 */
1587int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1588{
1589 if (nw_init_flag == 0 || nw_info_handle == NULL)
1590 {
xy.heb41615b2025-05-28 16:33:20 +08001591 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001592 }
1593
1594 if(handle_ptr == NULL)
1595 {
q.huang934ec0e2025-07-22 19:56:59 +08001596 LOGE(GSW_NW,"rej cause handle_ptr is NULL\n");
b.liu68a94c92025-05-24 12:53:41 +08001597 }
1598
1599 reject_cb = handle_ptr;
1600
1601 return GSW_HAL_SUCCESS;
1602}
1603
q.huang81905ea2025-07-25 20:19:41 +08001604static void gsw_un_reg_all()
1605{
1606 gsw_reg_serving_info_callback(NULL);
1607 gsw_reg_sig_info_callback(NULL);
1608 gsw_reg_operating_mode_callback(NULL);
1609 gsw_reg_set_modem_status_event_callback(NULL);
1610 gsw_reg_rej_cause_callback(NULL);
1611}
1612
1613pthread_t s_tid[NW_THEAD_NUM] = {-1,-1,-1};
1614void* s_thread_func[NW_THEAD_NUM]={
1615 (void*)gsw_sig_info_timer,
1616 (void*)gsw_modem_state_timer,
1617 (void*)gsw_serving_info_timer
1618 };
1619
1620static void gsw_close_all_thread()
1621{
1622 int i,ret;
1623
1624
1625 nw_init_flag=0;
1626
1627/* had better not use thread cancel, maybe handle->send_mutex is locked now, cancel will not release this mutex
1628 for(i=0; i<NW_THEAD_NUM; i++)
1629 {
1630 if(s_tid[i]!=-1)
1631 {
1632 ret = pthread_cancel(s_tid[i]);
1633 LOGE(GSW_NW,"pthread %d cancel, ret is %d",i, ret);
1634 }
1635 }
1636*/
1637
1638 for(i=0;i<NW_THEAD_NUM;i++)
1639 {
1640 if(s_tid[i]!=-1)
1641 {
1642 ret = pthread_join(s_tid[i],NULL);
1643 LOGE(GSW_NW,"pthread %d join, ret is %d",i, ret);
1644 s_tid[i]=-1;
1645 }
1646 }
1647}
1648
1649static int gsw_start_all_thread()
1650{
1651 int i,ret;
1652 for(i=0; i<NW_THEAD_NUM;i++)
1653 {
1654 ret = pthread_create(&(s_tid[i]), NULL,s_thread_func[i], NULL);
1655 if (ret != 0)
1656 {
1657 LOGE(GSW_NW,"pthread_create fail %d,ret is %d",i,ret);
1658 gsw_close_all_thread();
1659 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
1660 }
1661 }
1662
1663 return GSW_HAL_SUCCESS;
1664
1665}
1666
1667
b.liu68a94c92025-05-24 12:53:41 +08001668
1669/**
1670 * @brief network sdk init
1671 * @param [in] token usr id define by who use
1672 * @retval 0: success
1673 * @retval other: fail
1674 */
1675int gsw_nw_sdk_init(int token)
1676{
b.liu68a94c92025-05-24 12:53:41 +08001677 if (nw_init_flag == 1 && nw_info_handle != NULL)
1678 {
1679 return GSW_HAL_SUCCESS;
1680 }
1681
q.huang81905ea2025-07-25 20:19:41 +08001682 int ret = mbtk_nw_api_import();
b.liu68a94c92025-05-24 12:53:41 +08001683 if (ret != 0)
1684 {
q.huang81905ea2025-07-25 20:19:41 +08001685 printf("mbtk_nw_api_import fail");
xy.heb41615b2025-05-28 16:33:20 +08001686 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001687 }
1688
1689 nw_info_handle = mbtk_info_handle_get();
1690
1691 if (nw_info_handle == NULL)
1692 {
q.huang81905ea2025-07-25 20:19:41 +08001693 LOGE(GSW_NW,"mbtk_info_handle_get fail");
xy.heb41615b2025-05-28 16:33:20 +08001694 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001695 }
1696
1697 char fplmn[256] = {0};
1698 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1699 if(ret != 0)
1700 {
q.huang81905ea2025-07-25 20:19:41 +08001701 LOGE(GSW_NW,"mbtk_fplmn_get failed, ret is %d",ret);
xy.heb41615b2025-05-28 16:33:20 +08001702 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001703 }
1704 fplmn_max_length = (strlen(fplmn)/6);
q.huang81905ea2025-07-25 20:19:41 +08001705 LOGE(GSW_NW,"fplmn = %s, fplmn_max_length = %d",fplmn,fplmn_max_length);
b.liu68a94c92025-05-24 12:53:41 +08001706
q.huang66b79162025-06-27 17:45:34 +08001707 nw_init_flag = 1;
q.huang81905ea2025-07-25 20:19:41 +08001708 ret=gsw_start_all_thread();
q.huang66b79162025-06-27 17:45:34 +08001709
q.huang81905ea2025-07-25 20:19:41 +08001710 if(ret != 0)
xy.hec89938f2025-05-29 14:08:47 +08001711 {
q.huang81905ea2025-07-25 20:19:41 +08001712 nw_init_flag = 0;
1713 LOGE(GSW_NW,"gsw_start_all_thread failed , ret is %d",ret);
1714 return GSW_HAL_NORMAL_FAIL;
xy.hec89938f2025-05-29 14:08:47 +08001715 }
1716
q.huang81905ea2025-07-25 20:19:41 +08001717 LOGE(GSW_NW,"gsw nw init suc");
b.liu68a94c92025-05-24 12:53:41 +08001718
1719 return GSW_HAL_SUCCESS;
1720}
1721
1722
1723/**
1724 * @brief network sdk deinit
1725 * @param
1726 * @retval 0: success
1727 * @retval other: fail
1728 */
1729int gsw_nw_sdk_deinit(void)
1730{
1731 int ret = -1;
1732
1733 if (nw_init_flag == 0 || nw_info_handle == NULL)
1734 {
xy.heb41615b2025-05-28 16:33:20 +08001735 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001736 }
1737
q.huang81905ea2025-07-25 20:19:41 +08001738 gsw_un_reg_all();// had better un-reg before thread close
1739 gsw_close_all_thread();//in it, nw_init_flag=0 and cb unreg
1740
b.liu68a94c92025-05-24 12:53:41 +08001741 ret = mbtk_info_handle_free(&nw_info_handle);
1742 if(ret != GSW_HAL_SUCCESS)
1743 {
q.huang81905ea2025-07-25 20:19:41 +08001744 LOGE(GSW_NW,"mbtk_info_handle_free fail");
xy.heb41615b2025-05-28 16:33:20 +08001745 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001746 }
1747
1748 dlclose(dlHandle_mbtk);
1749 nw_info_handle = NULL;
q.huang81905ea2025-07-25 20:19:41 +08001750
1751 LOGE(GSW_NW,"gsw_nw_sdk_deinit suc");
b.liu68a94c92025-05-24 12:53:41 +08001752
1753 return GSW_HAL_SUCCESS;
1754
1755}
1756
1757
1758/**
1759 * @brief get current network reg info
1760 * @param [out] serving_info struct for network info
1761 * include regstate ps_state opreator name mcc mcn etc
1762 * @retval 0: success
1763 * @retval other: fail
1764 */
1765int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1766{
1767
1768 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001769 if (nw_init_flag == 0 || nw_info_handle == NULL)
1770 {
q.huang238b22a2025-06-10 14:36:59 +08001771 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001772 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001773 }
1774
q.huang934ec0e2025-07-22 19:56:59 +08001775 LOGE(GSW_NW,"mbtk_net_reg_get start \n");
b.liu68a94c92025-05-24 12:53:41 +08001776 //regstate
1777 mbtk_net_reg_info_t reg;
b.liu68a94c92025-05-24 12:53:41 +08001778 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1779 if(ret)
1780 {
q.huang934ec0e2025-07-22 19:56:59 +08001781 LOGE(GSW_NW,"mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001782 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001783 }
1784
q.huang934ec0e2025-07-22 19:56:59 +08001785 LOGE(GSW_NW,"convert_cs_reg_state\n");
b.liu68a94c92025-05-24 12:53:41 +08001786 //cs_state
1787 serving_info->reg_state = convert_reg_state(reg.call_state);
q.huang934ec0e2025-07-22 19:56:59 +08001788 LOGE(GSW_NW,"convert_ps_reg_state\n");
b.liu68a94c92025-05-24 12:53:41 +08001789 //ps_state
1790 serving_info->ps_state = convert_reg_state(reg.data_state);
q.huang934ec0e2025-07-22 19:56:59 +08001791 LOGE(GSW_NW,"convert_rat_mode\n");
b.liu68a94c92025-05-24 12:53:41 +08001792 //reg_rat
1793 serving_info->reg_rat = convert_net_mode(reg.type);
1794 //srv_domain
1795 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1796 {
1797 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1798 {
1799 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1800 }
1801
1802 else
1803 {
1804 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1805 }
1806 }
1807
1808 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1809 {
1810 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1811 }
1812
1813 else
1814 {
1815 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1816 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1817 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1818 }
1819
q.huang934ec0e2025-07-22 19:56:59 +08001820 LOGD(GSW_NW,"roaming_ind\n");
b.liu68a94c92025-05-24 12:53:41 +08001821 //roaming_ind
1822 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1823 {
1824 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1825 }
1826 else
1827 {
1828 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1829 }
1830
q.huang934ec0e2025-07-22 19:56:59 +08001831 LOGD(GSW_NW,"reject\n");
b.liu68a94c92025-05-24 12:53:41 +08001832 //reject
1833 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1834 {
q.huang934ec0e2025-07-22 19:56:59 +08001835 LOGD(GSW_NW,"reject_callback\n");
b.liu68a94c92025-05-24 12:53:41 +08001836 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1837 }
1838
q.huang934ec0e2025-07-22 19:56:59 +08001839 LOGD(GSW_NW,"reg_plmn / operator name\n");
b.liu68a94c92025-05-24 12:53:41 +08001840 //reg_plmn / operator name
1841 mbtk_net_info_t net;
q.huang934ec0e2025-07-22 19:56:59 +08001842 LOGD(GSW_NW,"mbtk_net_sel_mode_get start \n");
b.liu68a94c92025-05-24 12:53:41 +08001843 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
q.huang934ec0e2025-07-22 19:56:59 +08001844 LOGD(GSW_NW,"mbtk_net_sel_mode_get end \n");
b.liu68a94c92025-05-24 12:53:41 +08001845 if(ret == 0 && net.plmn > 0)
1846 {
1847 int i = 0;
1848
q.huang934ec0e2025-07-22 19:56:59 +08001849 LOGD(GSW_NW,"start to find mcc");
b.liu68a94c92025-05-24 12:53:41 +08001850 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1851 {
1852 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1853 {
q.huang934ec0e2025-07-22 19:56:59 +08001854 LOGD(GSW_NW,"find mcc\n");
b.liu68a94c92025-05-24 12:53:41 +08001855 break;
1856 }
1857 i++;
1858 }
1859
1860
1861 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1862 {
q.huang934ec0e2025-07-22 19:56:59 +08001863 LOGD(GSW_NW,"not find mcc");
b.liu68a94c92025-05-24 12:53:41 +08001864 strcpy(serving_info->operator_name, "unknown");
hong.liud2417072025-06-27 07:10:37 -07001865 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001866 }
1867
1868 else
1869 {
q.huang934ec0e2025-07-22 19:56:59 +08001870 LOGD(GSW_NW,"find mcc\n");
b.liu68a94c92025-05-24 12:53:41 +08001871 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
hong.liud2417072025-06-27 07:10:37 -07001872 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001873 }
1874
q.huang934ec0e2025-07-22 19:56:59 +08001875 LOGE(GSW_NW,"operator_name = %s\n", serving_info->operator_name);
1876 LOGE(GSW_NW,"reg_plmn = %s\n", serving_info->reg_plmn);
b.liu68a94c92025-05-24 12:53:41 +08001877 }
1878
1879
q.huang934ec0e2025-07-22 19:56:59 +08001880 LOGD(GSW_NW,"get cell id/tac/lac/sid/nid\n");
b.liu68a94c92025-05-24 12:53:41 +08001881 //cell id/tac/lac/sid/nid
1882 mbtk_cell_type_enum cell_type;
b.liu68a94c92025-05-24 12:53:41 +08001883 list_node_t* cell_list = NULL;
1884
q.huang934ec0e2025-07-22 19:56:59 +08001885 LOGD(GSW_NW,"mbtk_cell_get start\n");
b.liu68a94c92025-05-24 12:53:41 +08001886 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1887 if(ret != 0 || cell_list == NULL)
1888 {
q.huang934ec0e2025-07-22 19:56:59 +08001889 LOGE(GSW_NW,"mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001890 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001891 }
1892 else
1893 {
q.huang934ec0e2025-07-22 19:56:59 +08001894 LOGE(GSW_NW,"mbtk_cell_get end,start to get node\n");
b.liu68a94c92025-05-24 12:53:41 +08001895 list_first(cell_list);
q.huang934ec0e2025-07-22 19:56:59 +08001896 LOGE(GSW_NW,"list_first end\n");
b.liu68a94c92025-05-24 12:53:41 +08001897 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1898 if(cell)
1899 {
q.huang934ec0e2025-07-22 19:56:59 +08001900 LOGE(GSW_NW,"cell is not null,value2 = %u\n",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001901 switch(cell_type)
1902 {
1903 case MBTK_CELL_TYPE_LTE:
1904 {
q.huang934ec0e2025-07-22 19:56:59 +08001905 LOGE(GSW_NW,"is lte\n");
1906 //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);
1907 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 -07001908 snprintf(serving_info->tac,sizeof(serving_info->tac),"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001909 strcpy(serving_info->lac,"");
hong.liud2417072025-06-27 07:10:37 -07001910 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%u",cell->value10);
b.liu68a94c92025-05-24 12:53:41 +08001911 break;
1912 }
1913
1914 case MBTK_CELL_TYPE_GSM:
1915 {
q.huang934ec0e2025-07-22 19:56:59 +08001916 LOGE(GSW_NW,"is gsm\n");
1917 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 -07001918 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001919 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001920 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001921 break;
1922 }
1923 case MBTK_CELL_TYPE_UMTS:
1924 {
q.huang934ec0e2025-07-22 19:56:59 +08001925 LOGE(GSW_NW,"is wcdma\n");
1926 LOGE(GSW_NW,"UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
hong.liud2417072025-06-27 07:10:37 -07001927 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001928 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001929 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001930 break;
1931 }
1932
1933 default:
1934 break;
1935 }
1936 }
1937 else
1938 {
q.huang934ec0e2025-07-22 19:56:59 +08001939 LOGE(GSW_NW,"cell is null\n");
b.liu68a94c92025-05-24 12:53:41 +08001940 }
1941 }
1942
1943 //not support now
1944 serving_info->sid = 0;
1945 serving_info->nid = 0;
1946
1947 return GSW_HAL_SUCCESS;
1948}
1949
1950
1951/**
1952 * @brief get current network type
1953 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1954 * @retval 0: success
1955 * @retval other: fail
1956 */
hong.liud2417072025-06-27 07:10:37 -07001957int gsw_get_netype(int32_t *netype)
b.liu68a94c92025-05-24 12:53:41 +08001958{
1959 int ret = -1;
1960
1961 if (nw_init_flag == 0 || nw_info_handle == NULL)
1962 {
xy.heb41615b2025-05-28 16:33:20 +08001963 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001964 }
1965
1966 //regstate
1967 mbtk_net_reg_info_t reg;
1968 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1969 if(ret)
1970 {
q.huang934ec0e2025-07-22 19:56:59 +08001971 LOGE(GSW_NW,"mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001972 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001973 }
1974
1975 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1976 {
1977 *netype = convert_net_mode(reg.type);
1978 }
1979 else
1980 {
1981 *netype = GSW_NETWORK_RADIO_NO_SVC;
1982 }
1983
1984 return GSW_HAL_SUCCESS;
1985}
1986
1987
1988/**
1989 * @brief get radio opmode, as open and close airplane mode
1990 * @param [out] op_mode 1 is radio on, 0 is radio off
1991 * @retval 0: success
1992 * @retval other: fail
1993 */
1994int gsw_get_opmode(int *op_mode)
1995{
1996 int tmp_rf = -1;
1997 int ret = -1;
1998 if (nw_init_flag == 0 || nw_info_handle == NULL)
1999 {
xy.heb41615b2025-05-28 16:33:20 +08002000 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002001 }
2002
2003 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
2004 if (ret != 0)
2005 {
q.huang934ec0e2025-07-22 19:56:59 +08002006 LOGE(GSW_NW,"mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002007 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002008 }
2009 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
2010 {
2011 *op_mode = GSW_OP_MODE_LPM;
2012 }
2013
2014 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
2015 {
2016 *op_mode = GSW_OP_MODE_OFFLINE;
2017 }
2018
2019 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
2020 {
2021 *op_mode = GSW_OP_MODE_ONLINE;
2022 }
2023
2024 return GSW_HAL_SUCCESS;
2025}
2026
2027
2028
2029/**
2030 * @brief set radio opmode, as open and close airplane mode
2031 * @param [in] op_mode 1 is radio on, 0 is radio off
2032 * @retval 0: success
2033 * @retval other: fail
2034 */
hong.liud2417072025-06-27 07:10:37 -07002035int gsw_set_opmode(int32_t op_mode)
b.liu68a94c92025-05-24 12:53:41 +08002036{
2037 mbtk_modem_info_t info;
2038 int rf_mode = -1;
2039 int ret = -1;
2040
2041 if (nw_init_flag == 0 || nw_info_handle == NULL)
2042 {
xy.heb41615b2025-05-28 16:33:20 +08002043 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002044 }
2045
2046 if(op_mode == GSW_OP_MODE_LPM)
2047 {
2048 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
2049 }
2050
2051 if(op_mode == GSW_OP_MODE_ONLINE)
2052 {
2053 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
2054 }
2055
2056 if(op_mode == GSW_OP_MODE_OFFLINE)
2057 {
2058 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
2059 }
2060
2061 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
2062 {
q.huang934ec0e2025-07-22 19:56:59 +08002063 LOGE(GSW_NW,"Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002064 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002065 }
2066
2067 info.fun = rf_mode;
2068 info.rst = 0;
2069 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2070 if (ret != 0)
2071 {
q.huang934ec0e2025-07-22 19:56:59 +08002072 LOGE(GSW_NW,"gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002073 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002074 }
2075
2076 return GSW_HAL_SUCCESS;
2077
2078}
2079
2080
2081/**
2082 * @brief get network mode preference of mdm search network scale
2083 * @param [out] mode_pref net_work pref mode:
2084 * enum prefer_mode
2085 * @retval 0: success
2086 * @retval other: fail
2087 */
hong.liud2417072025-06-27 07:10:37 -07002088int gsw_get_mode_preference(int32_t *mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002089{
2090 if (nw_init_flag == 0 || nw_info_handle == NULL)
2091 {
xy.heb41615b2025-05-28 16:33:20 +08002092 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002093 }
2094
2095 int ret = -1;
2096 mbtk_band_info_t band;
2097 memset(&band, 0, sizeof(mbtk_band_info_t));
2098
2099 ret = mbtk_current_band_get(nw_info_handle, &band);
2100 if(ret != 0)
2101 {
q.huang934ec0e2025-07-22 19:56:59 +08002102 LOGE(GSW_NW,"mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002103 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002104 }
2105
2106 *mode_pref = convert_gsw_net_config(band.net_pref);
q.huang934ec0e2025-07-22 19:56:59 +08002107 LOGE(GSW_NW,"band.net_pref = %d\n", *mode_pref);
b.liu68a94c92025-05-24 12:53:41 +08002108 if(*mode_pref <= 0)
2109 {
q.huang934ec0e2025-07-22 19:56:59 +08002110 LOGE(GSW_NW,"no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002111 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002112 }
2113 return GSW_HAL_SUCCESS;
2114
2115
2116}
2117
2118/**
2119 * @brief set network mode preference of mdm search network scale
2120 * @param [in] mode_pref net_work pref mode:
2121 * enum prefer_mode
2122 * @retval 0: success
2123 * @retval other: fail
2124 */
hong.liud2417072025-06-27 07:10:37 -07002125int gsw_set_mode_preference(int32_t mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002126{
2127 if (nw_init_flag == 0 || nw_info_handle == NULL)
2128 {
xy.heb41615b2025-05-28 16:33:20 +08002129 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002130 }
2131
2132 int ret = -1;
2133
2134 mbtk_band_info_t band;
2135 memset(&band, 0, sizeof(mbtk_band_info_t));
2136
2137 band.net_pref = convert_mbtk_net_config(mode_pref);
q.huang934ec0e2025-07-22 19:56:59 +08002138 LOGE(GSW_NW,"band.net_pref = %d\n", band.net_pref);
b.liu68a94c92025-05-24 12:53:41 +08002139
2140 if(band.net_pref < 0)
2141 {
q.huang934ec0e2025-07-22 19:56:59 +08002142 LOGE(GSW_NW,"no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002143 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002144 }
2145
2146 ret = mbtk_current_band_set(nw_info_handle, &band);
2147 if(ret != 0)
2148 {
q.huang934ec0e2025-07-22 19:56:59 +08002149 LOGE(GSW_NW,"mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002150 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002151 }
2152
2153 return GSW_HAL_SUCCESS;
2154}
2155
2156/**
2157 * @brief get signal csq value
2158 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
2159 * @retval 0: success
2160 * @retval other: fail
2161 */
hong.liud2417072025-06-27 07:10:37 -07002162int gsw_get_sig_info(int32_t *csq_value)
b.liu68a94c92025-05-24 12:53:41 +08002163{
b.liu68a94c92025-05-24 12:53:41 +08002164 if (nw_init_flag == 0 || nw_info_handle == NULL)
2165 {
xy.heb41615b2025-05-28 16:33:20 +08002166 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002167 }
2168
q.huangdaa16d42025-07-03 14:32:48 +08002169 mbtk_signal_info_t signal;
q.huangfa0a0a32025-06-12 17:07:23 +08002170 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08002171 if(ret != 0)
2172 {
q.huang934ec0e2025-07-22 19:56:59 +08002173 LOGE(GSW_NW,"mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002174 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002175 }
2176
q.huang934ec0e2025-07-22 19:56:59 +08002177 LOGD(GSW_NW,"signal.type=%d\n", signal.type);
b.liu68a94c92025-05-24 12:53:41 +08002178 switch(signal.type)
2179 {
q.huangfa0a0a32025-06-12 17:07:23 +08002180
b.liu68a94c92025-05-24 12:53:41 +08002181 case MBTK_RADIO_TECH_E_UTRAN:
2182 {
q.huang934ec0e2025-07-22 19:56:59 +08002183 LOGD(GSW_NW,"lte rsrp = %d dbm",signal.rsrp-141);
q.huangfa0a0a32025-06-12 17:07:23 +08002184 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08002185 break;
2186 }
2187 case MBTK_RADIO_TECH_UTRAN:
2188 case MBTK_RADIO_TECH_UTRAN_HSDPA:
2189 case MBTK_RADIO_TECH_UTRAN_HSUPA:
2190 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
2191 case MBTK_RADIO_TECH_UTRAN_HSPA:
2192 {
q.huang934ec0e2025-07-22 19:56:59 +08002193 LOGD(GSW_NW,"w rscp = %d dbm",signal.rscp-121);
q.huangfa0a0a32025-06-12 17:07:23 +08002194 *csq_value = rscpToLevel(signal.rscp-121);
2195 break;
2196 }
2197 case MBTK_RADIO_TECH_GSM:
2198 case MBTK_RADIO_TECH_GSM_COMPACT:
2199 case MBTK_RADIO_TECH_GSM_EGPRS:
2200 {
q.huang934ec0e2025-07-22 19:56:59 +08002201 LOGD(GSW_NW,"gsm rxlev = %d (0-63)",signal.rxlev);
q.huang861c07d2025-06-24 16:54:58 +08002202 *csq_value = rxlevToLevel(signal.rxlev);
b.liu68a94c92025-05-24 12:53:41 +08002203 break;
2204 }
2205 default:
2206 {
q.huang934ec0e2025-07-22 19:56:59 +08002207 LOGE(GSW_NW,"[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08002208 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002209 }
2210 }
2211 return GSW_HAL_SUCCESS;
2212}
2213
2214/**
2215 * @brief set nework power mode, for tcam enter standby or exit standby
2216 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
2217 * @retval 0: success
2218 * @retval other: fail
2219 */
lichengzhang0ba58962025-07-15 17:39:03 +08002220
2221int gsw_nw_power_mode = 0;
b.liu68a94c92025-05-24 12:53:41 +08002222int gsw_network_set_power_mode(char mode)
2223{
lichengzhang640b4f82025-07-21 16:19:33 +08002224 int ret = -1;
2225 if (nw_init_flag == 0)//nw_info_handle == NULL Don't need
b.liu68a94c92025-05-24 12:53:41 +08002226 {
xy.heb41615b2025-05-28 16:33:20 +08002227 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002228 }
2229
2230 if(mode != 0 && mode != 1)
2231 {
q.huang934ec0e2025-07-22 19:56:59 +08002232 LOGE(GSW_NW,"Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002233 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002234 }
2235
2236 if(mode == 1)
lichengzhang0ba58962025-07-15 17:39:03 +08002237 gsw_nw_power_mode = 3;
2238 else
2239 gsw_nw_power_mode = 1;
q.huang934ec0e2025-07-22 19:56:59 +08002240
2241 LOGE(GSW_NW,"mode is %d\n",gsw_nw_power_mode);
lichengzhang640b4f82025-07-21 16:19:33 +08002242 ret = mbtk_wakeup_state_set(nw_info_handle, gsw_nw_power_mode);
2243 if(ret != 0)
2244 {
q.huang934ec0e2025-07-22 19:56:59 +08002245 LOGE(GSW_NW,"mbtk_wakeup_state_set fail\n");
lichengzhang640b4f82025-07-21 16:19:33 +08002246 return GSW_HAL_NORMAL_FAIL;
2247 }
b.liu68a94c92025-05-24 12:53:41 +08002248
2249 return GSW_HAL_SUCCESS;
2250
b.liu68a94c92025-05-24 12:53:41 +08002251}
2252
2253/**
2254 * @brief convert rsrp rscp rssi to csq value.
2255 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2256 * @param [in] sigvalue input signal_strength for different nettype
2257 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2258
2259 * @retval csq
2260 * @retval other: fail
2261 */
hong.liud2417072025-06-27 07:10:37 -07002262int gsw_sigInfo_to_csq(int32_t netType, int32_t sigValue)
b.liu68a94c92025-05-24 12:53:41 +08002263{
q.huang238b22a2025-06-10 14:36:59 +08002264 if (nw_init_flag == 0 || nw_info_handle == NULL)
2265 {
2266 return GSW_HAL_NORMAL_FAIL;
2267 }
b.liu68a94c92025-05-24 12:53:41 +08002268 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002269 {
2270 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002271 {
q.huangfa0a0a32025-06-12 17:07:23 +08002272 return rsrpToLevel(sigValue);
2273 }
2274 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002275 {
q.huangfa0a0a32025-06-12 17:07:23 +08002276 return rscpToLevel(sigValue);
2277 }
2278 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002279 {
q.huangfa0a0a32025-06-12 17:07:23 +08002280 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002281 }
2282
2283 default:
2284 {
q.huang934ec0e2025-07-22 19:56:59 +08002285 LOGE(GSW_NW,"parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002286 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002287 }
2288 }
2289}
2290
2291/*
2292 * @brief get mobile operator name
2293 @param [out] nw_operator_name_infos get the long and short operator name info
2294 @retval 0: success
2295 @retval 0: other: fail
2296 */
2297int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2298{
2299 char OperatorFN[128];
2300 char OperatorSH[128];
hong.liud2417072025-06-27 07:10:37 -07002301 char temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002302 mbtk_net_info_t net;
2303
2304 if (nw_init_flag == 0 || nw_info_handle == NULL)
2305 {
xy.heb41615b2025-05-28 16:33:20 +08002306 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002307 }
2308
2309 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2310 {
q.huang934ec0e2025-07-22 19:56:59 +08002311 LOGE(GSW_NW,"Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08002312 int i = 0;
2313 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2314 {
2315 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2316 break;
2317 i++;
2318 }
2319
2320 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2321 {
2322 strcpy(OperatorFN, "UNKNOWN");
2323 strcpy(OperatorSH, "UNKNOWN");
2324 }
2325 else
2326 {
2327 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2328 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2329
q.huangdaa16d42025-07-03 14:32:48 +08002330
hong.liud2417072025-06-27 07:10:37 -07002331 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
b.liu68a94c92025-05-24 12:53:41 +08002332 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2333
q.huangdaa16d42025-07-03 14:32:48 +08002334
hong.liud2417072025-06-27 07:10:37 -07002335 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
b.liu68a94c92025-05-24 12:53:41 +08002336 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2337 }
2338
2339 memset(nw_operator_name_infos->long_eons,0,128);
2340 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2341 memset(nw_operator_name_infos->short_eons,0,128);
2342 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2343
2344 return GSW_HAL_SUCCESS;
2345 }
2346
2347 else
2348 {
q.huang934ec0e2025-07-22 19:56:59 +08002349 LOGE(GSW_NW,"mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002350 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002351 }
2352
2353 return GSW_HAL_SUCCESS;
2354}
2355
2356
2357/*
2358 * @brief get current serving cell info
2359 * @param cell_info: [out] struct for current cell info
2360 * include earfcn mcc mnc pci psc tac lac etc.
2361 * @return int: 0 is success, other failed
2362 */
2363int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2364{
b.liu68a94c92025-05-24 12:53:41 +08002365
2366 if (nw_init_flag == 0 || nw_info_handle == NULL)
2367 {
q.huang238b22a2025-06-10 14:36:59 +08002368 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002369 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002370 }
2371
2372 list_node_t* cell_list = NULL;
b.liu68a94c92025-05-24 12:53:41 +08002373 mbtk_cell_type_enum type;
q.huang638d5872025-06-21 13:44:43 +08002374 int ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
b.liu68a94c92025-05-24 12:53:41 +08002375 if(ret || cell_list == NULL) {
q.huang934ec0e2025-07-22 19:56:59 +08002376 LOGE(GSW_NW,"mbtk_cell_get failed : %d\n", ret);
q.huang638d5872025-06-21 13:44:43 +08002377 list_free(cell_list);
2378 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002379 } else {
q.huang638d5872025-06-21 13:44:43 +08002380 memset(cell_info,0,sizeof(GSW_NW_CELL_INFO));
b.liu68a94c92025-05-24 12:53:41 +08002381 list_first(cell_list);
2382 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2383 if(cell) { // Current server cell.
2384 switch(type)
2385 {
2386 case 0:
2387 {
q.huang934ec0e2025-07-22 19:56:59 +08002388 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 +08002389 char gsm_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002390
2391 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2392
2393 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002394 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002395 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2396
b.liu68a94c92025-05-24 12:53:41 +08002397 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002398 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value6);
b.liu68a94c92025-05-24 12:53:41 +08002399 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2400
2401 cell_info->cell_id_valid = 1;
2402 cell_info->cell_id = cell->value2;
2403
2404 cell_info->lac_valid = 1;
2405 cell_info->lac = cell->value1;
2406
2407 cell_info->arfcn_valid = 1;
2408 cell_info->arfcn = cell->value3;
q.huang861c07d2025-06-24 16:54:58 +08002409
2410 cell_info->rssi=rxlev_convert_to_rssi_dBm(cell->value7);
2411 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002412 break;
2413 }
2414
2415 case 1:
2416 {
q.huang934ec0e2025-07-22 19:56:59 +08002417 LOGD(GSW_NW,"UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
q.huangdaa16d42025-07-03 14:32:48 +08002418 char wcdma_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002419
2420 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2421
2422 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002423 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value4);
b.liu68a94c92025-05-24 12:53:41 +08002424 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2425
b.liu68a94c92025-05-24 12:53:41 +08002426 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002427 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002428 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2429
2430 cell_info->lac_valid = 1;
2431 cell_info->lac = cell->value1;
2432
2433 cell_info->cell_id_valid = 1;
2434 cell_info->cell_id = cell->value2;
2435
2436 cell_info->uarfcn_valid = 1;
2437 cell_info->uarfcn = cell->value3;
2438
2439 cell_info->psc_valid = 1;
2440 cell_info->psc = cell->value6;
2441 break;
2442 }
2443
2444 case 2:
2445 {
q.huang934ec0e2025-07-22 19:56:59 +08002446 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 +08002447
q.huangdaa16d42025-07-03 14:32:48 +08002448 char lte_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002449 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2450
2451 cell_info->mcc_valid = 1;
2452 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2453 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2454
b.liu68a94c92025-05-24 12:53:41 +08002455 cell_info->mnc_valid = 1;
2456 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2457 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2458
2459 cell_info->tac_valid = 1;
2460 cell_info->tac = cell->value1;
2461
2462 cell_info->pci_valid = 1;
2463 cell_info->pci = cell->value2;
2464
2465 cell_info->earfcn_valid = 1;
2466 cell_info->earfcn = cell->value3;
2467
2468 cell_info->bler_valid = 1;
2469 cell_info->bler = cell->value4;
2470
2471 cell_info->band_valid = 1;
2472 cell_info->band = cell->value5;
2473
q.huang638d5872025-06-21 13:44:43 +08002474 cell_info->rssnr = sinr_convert_to_10_times_dB(cell->value11);
2475 cell_info->rssnr_valid=(cell_info->rssnr!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002476
q.huang638d5872025-06-21 13:44:43 +08002477 cell_info->lteMode_valid = 1;
2478 cell_info->lteMode =(!(cell->value12));
2479
2480
2481 cell_info->rsrp = rsrp_convert_to_minus_dBm(cell->value8);
2482 cell_info->rsrp_valid = (cell_info->rsrp!=INT_32_MAX);
2483
2484 cell_info->rsrq = rsrq_convert_to_minus_dB(cell->value9);
2485 cell_info->rsrq_valid = (cell_info->rsrq!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002486
2487 cell_info->cell_id_valid = 1;
2488 cell_info->cell_id = cell->value10;
2489
q.huang638d5872025-06-21 13:44:43 +08002490 cell_info->rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->rsrp);
2491 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
2492
b.liu68a94c92025-05-24 12:53:41 +08002493 break;
2494 }
2495
2496 default:
2497 break;
2498 }
2499 }
q.huang638d5872025-06-21 13:44:43 +08002500 int neibor_count = 0;
b.liu68a94c92025-05-24 12:53:41 +08002501 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2502 {
2503 switch(type)
2504 {
2505 //GSM
2506 case 0:
2507 {
2508
2509 }
2510 //WCDMA
2511 case 1:
2512 {
q.huang934ec0e2025-07-22 19:56:59 +08002513 LOGE(GSW_NW,"CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
b.liu68a94c92025-05-24 12:53:41 +08002514
2515 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2516
2517 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2518 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2519
2520 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2521 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2522
2523 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2524
2525 neibor_count++;
2526
2527 }
2528 //LTE
2529 case 2:
2530 {
q.huang934ec0e2025-07-22 19:56:59 +08002531 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 +08002532 char lte_temp[12] = {0};
2533 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2534
q.huangdaa16d42025-07-03 14:32:48 +08002535
b.liu68a94c92025-05-24 12:53:41 +08002536 cell_info->ext_info[neibor_count].pci = cell->value1;
2537 cell_info->ext_info[neibor_count].pci_valid = 1;
2538
2539 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2540 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2541
q.huang638d5872025-06-21 13:44:43 +08002542 cell_info->ext_info[neibor_count].rsrp = rsrp_convert_to_minus_dBm(cell->value3);
2543 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 +08002544
q.huang638d5872025-06-21 13:44:43 +08002545 cell_info->ext_info[neibor_count].rsrq = rsrq_convert_to_minus_dB(cell->value4);
2546 cell_info->ext_info[neibor_count].rsrq_valid = (cell_info->ext_info[neibor_count].rsrq!=INT_32_MAX);
2547
2548 if(cell->value7!=INT_32_MAX)
2549 {
2550 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2551 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2552
2553 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2554 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 +08002555
b.liu68a94c92025-05-24 12:53:41 +08002556
q.huang638d5872025-06-21 13:44:43 +08002557 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2558 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mnc));
2559
2560
2561 //value 8 is tac
b.liu68a94c92025-05-24 12:53:41 +08002562
q.huang638d5872025-06-21 13:44:43 +08002563 cell_info->ext_info[neibor_count].band = cell->value9;
2564 cell_info->ext_info[neibor_count].band_valid = 1;
2565
2566 cell_info->ext_info[neibor_count].rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->ext_info[neibor_count].rsrp);
2567 cell_info->ext_info[neibor_count].rssi_valid = (cell_info->ext_info[neibor_count].rssi!=INT_32_MAX);
2568 }
b.liu68a94c92025-05-24 12:53:41 +08002569
2570 neibor_count++;
2571 }
2572
2573 default:
2574 break;
2575 }
2576 }
q.huang638d5872025-06-21 13:44:43 +08002577 cell_info->ext_info_len=neibor_count;
b.liu68a94c92025-05-24 12:53:41 +08002578 }
2579 list_free(cell_list);
2580
2581 return GSW_HAL_SUCCESS;
2582}
2583
2584/*
2585 * @brief set modem status event callback
2586 @param [in] handle_ptr callback function address
2587 @retval 0: success
2588 @retval 0: other: fail
2589 */
2590int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2591{
2592
2593 if (nw_init_flag == 0 || nw_info_handle == NULL)
2594 {
xy.heb41615b2025-05-28 16:33:20 +08002595 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002596 }
2597
b.liu68a94c92025-05-24 12:53:41 +08002598 if(handle_ptr == NULL)
2599 {
q.huang934ec0e2025-07-22 19:56:59 +08002600 LOGE(GSW_NW,"reg modem state cb, handle_ptr is NULL\n");
b.liu68a94c92025-05-24 12:53:41 +08002601 }
2602
2603 modem_cb = handle_ptr;
2604
b.liu68a94c92025-05-24 12:53:41 +08002605 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08002606}
2607
2608
2609/*
2610 * @brief get PLMNs from the FPLMN list
2611 * @param [inout] plmn_list:
2612 * @retval 0: success
2613 * @retval other: fail
2614 */
2615int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2616{
2617 if (nw_init_flag == 0 || nw_info_handle == NULL)
2618 {
xy.heb41615b2025-05-28 16:33:20 +08002619 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002620 }
2621
2622 int ret = -1;
2623 char fplmn[256] = {0};
q.huang934ec0e2025-07-22 19:56:59 +08002624 LOGE(GSW_NW,"mbtk_fplmn_get enter\n");
b.liu68a94c92025-05-24 12:53:41 +08002625 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
q.huang934ec0e2025-07-22 19:56:59 +08002626 LOGE(GSW_NW,"mbtk_fplmn_get exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002627 if(ret != 0)
2628 {
q.huang934ec0e2025-07-22 19:56:59 +08002629 LOGE(GSW_NW,"mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002630 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002631 }
2632
2633 update_fplmn_list(fplmn);
2634 for(int i = 0; i < fplmn_index; i++)
2635 {
2636 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2637 {
2638 continue;
2639 }
2640 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 +08002641 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 +08002642 plmn_list->plmn_list_len++;
2643 }
2644
q.huang934ec0e2025-07-22 19:56:59 +08002645 LOGE(GSW_NW,"fplmn = %s\n", fplmn);
b.liu68a94c92025-05-24 12:53:41 +08002646 return GSW_HAL_SUCCESS;
2647}
2648
2649/*
2650 * @brief add PLMNs from the plmn_list to the FPLMN list
2651 * @param [in] plmn_list:
2652 * @retval 0: success
2653 * @retval other: fail
2654 */
2655int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2656{
2657
2658 if (nw_init_flag == 0 || nw_info_handle == NULL)
2659 {
xy.heb41615b2025-05-28 16:33:20 +08002660 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002661 }
2662
2663 if(plmn_list->plmn_list_len >= fplmn_max_length)
2664 {
q.huang934ec0e2025-07-22 19:56:59 +08002665 LOGE(GSW_NW,"can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002666 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002667 }
2668
2669 int i = 0;
2670 int index = -1;
2671
2672 for(i = 0; i < plmn_list->plmn_list_len; i++)
2673 {
2674 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2675
2676 if(index == -1)
2677 {
q.huang934ec0e2025-07-22 19:56:59 +08002678 LOGE(GSW_NW,"no this PLMN, add it\n");
b.liu68a94c92025-05-24 12:53:41 +08002679 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2680 {
q.huang934ec0e2025-07-22 19:56:59 +08002681 LOGE(GSW_NW,"can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002682 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002683 }
2684
2685 else
2686 {
2687 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2688 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2689 fplmn_array[fplmn_index][5] = '\0';
q.huang934ec0e2025-07-22 19:56:59 +08002690 LOGE(GSW_NW,"fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
b.liu68a94c92025-05-24 12:53:41 +08002691 fplmn_index++;
2692 }
2693 }
2694
2695 else
2696 {
q.huang934ec0e2025-07-22 19:56:59 +08002697 LOGE(GSW_NW,"already have this PLMN, don't add it\n");
b.liu68a94c92025-05-24 12:53:41 +08002698 }
2699 }
2700
2701 char fplmn_str[256] = {0};
2702 convert_plmn_to_fplmn_str(fplmn_str);
2703
q.huang934ec0e2025-07-22 19:56:59 +08002704 LOGE(GSW_NW,"fplmn_str = %s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002705
2706 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2707 if(ret != 0)
2708 {
q.huang934ec0e2025-07-22 19:56:59 +08002709 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002710 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002711 }
2712
q.huang934ec0e2025-07-22 19:56:59 +08002713 LOGE(GSW_NW,"gsw_add_forbidden_networks exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002714 return GSW_HAL_SUCCESS;
2715}
2716
2717/*
2718 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2719 * @param [in] plmn_list:
2720 * @retval 0: success
2721 * @retval other: fail
2722 */
2723int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2724{
b.liu68a94c92025-05-24 12:53:41 +08002725 if (nw_init_flag == 0 || nw_info_handle == NULL)
2726 {
q.huangfa0a0a32025-06-12 17:07:23 +08002727 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002728 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002729 }
2730
2731 int i = 0;
2732 int index = -1;
2733
2734 for(i = 0; i < plmn_list->plmn_list_len; i++)
2735 {
2736 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2737 if(index != -1)
2738 {
2739 remove_fplmn(index);
2740 }
2741 else
2742 {
q.huang934ec0e2025-07-22 19:56:59 +08002743 LOGE(GSW_NW,"no this PLMN, can't remove it\n");
b.liu68a94c92025-05-24 12:53:41 +08002744 }
2745 }
2746
2747 for(i = 0; i < fplmn_index; i++)
2748 {
q.huang934ec0e2025-07-22 19:56:59 +08002749 LOGE(GSW_NW,"fplmn_array[%d] = %s\n", i, fplmn_array[i]);
b.liu68a94c92025-05-24 12:53:41 +08002750 }
2751
2752 char fplmn_str[256] = {0};
2753 convert_plmn_to_fplmn_str(fplmn_str);
q.huang934ec0e2025-07-22 19:56:59 +08002754 LOGE(GSW_NW,"fplmn_str = %s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002755
2756 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2757 if(ret != 0)
2758 {
q.huang934ec0e2025-07-22 19:56:59 +08002759 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002760 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002761 }
2762
q.huang934ec0e2025-07-22 19:56:59 +08002763 LOGE(GSW_NW,"gsw_remove_forbidden_networks exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002764 return GSW_HAL_SUCCESS;
2765}
2766
2767/*
2768 * @brief clear FPLMN list
2769 * @param
2770 * @retval 0: success
2771 * @retval other: fail
2772 */
2773int gsw_clear_forbidden_networks(void)
2774{
2775 if (nw_init_flag == 0 || nw_info_handle == NULL)
2776 {
xy.heb41615b2025-05-28 16:33:20 +08002777 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002778 }
2779
2780 char fplmn_str[FPLMN_STRING_LENGTH+1];
2781 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2782 fplmn_str[(6 * fplmn_max_length)] = '\0';
2783
q.huang934ec0e2025-07-22 19:56:59 +08002784 LOGE(GSW_NW,"%s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002785 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2786 if(ret != 0)
2787 {
q.huang934ec0e2025-07-22 19:56:59 +08002788 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002789 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002790 }
2791
2792 return GSW_HAL_SUCCESS;
2793}
2794
2795/*
2796 * @brief get oos config
2797 * @param [in] oos_config
2798 * @retval 0: success
2799 * @retval other: fail
2800 */
2801int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2802{
2803 if (nw_init_flag == 0 || nw_info_handle == NULL)
2804 {
xy.heb41615b2025-05-28 16:33:20 +08002805 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002806 }
2807
2808 if(pt_info == NULL)
2809 {
q.huang934ec0e2025-07-22 19:56:59 +08002810 LOGE(GSW_NW,"pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002811 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002812 }
2813
2814 int ret = -1;
2815
2816 mbtk_oos_info oos_info;
2817 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2818
2819 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2820 if(ret != 0)
2821 {
q.huang934ec0e2025-07-22 19:56:59 +08002822 LOGE(GSW_NW,"mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002823 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002824 }
2825
2826 if(oos_info.mode == 0)
2827 {
2828 pt_info->t_min = 0;
2829 pt_info->t_step = 0;
2830 pt_info->t_max = 0;
2831 }
2832
2833 else
2834 {
2835 pt_info->t_min = (int)oos_info.oosPhase[0];
2836 pt_info->t_step = (int)oos_info.oosPhase[1];
2837 pt_info->t_max = (int)oos_info.oosPhase[2];
2838 }
2839
2840 return GSW_HAL_SUCCESS;
2841}
2842
2843
2844/*
2845 * @brief set oos config
2846 * @param [in] oos_config
2847 * @retval 0: success
2848 * @retval other: fail
2849 */
2850int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2851{
2852 if (nw_init_flag == 0 || nw_info_handle == NULL)
2853 {
xy.heb41615b2025-05-28 16:33:20 +08002854 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002855 }
2856
2857 if(pt_info == NULL)
2858 {
q.huang934ec0e2025-07-22 19:56:59 +08002859 LOGE(GSW_NW,"pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002860 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002861 }
2862
2863 int ret = -1;
2864 mbtk_oos_info oos_info;
2865 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2866
2867 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2868 {
q.huang934ec0e2025-07-22 19:56:59 +08002869 LOGE(GSW_NW,"gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002870 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002871 }
2872 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2873 {
2874 oos_info.mode = 1;
2875 oos_info.oosPhase[0] = pt_info->t_min;
2876 }
2877 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)
2878 {
2879 oos_info.mode = 1;
2880 oos_info.oosPhase[0] = pt_info->t_min;
2881 oos_info.oosPhase[1] = pt_info->t_step;
2882 }
2883 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))
2884 {
2885 oos_info.mode = 1;
2886 oos_info.oosPhase[0] = pt_info->t_min;
2887 oos_info.oosPhase[1] = pt_info->t_step;
2888 oos_info.oosPhase[2] = pt_info->t_max;
2889 }
2890 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2891 {
2892 oos_info.mode = 0;
2893 }
2894 else
2895 {
q.huang934ec0e2025-07-22 19:56:59 +08002896 LOGE(GSW_NW,"gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002897 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002898 }
2899
2900 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2901 if(ret != 0)
2902 {
q.huang934ec0e2025-07-22 19:56:59 +08002903 LOGE(GSW_NW,"mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002904 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002905 }
2906
2907 return GSW_HAL_SUCCESS;
2908}
2909
q.huang238b22a2025-06-10 14:36:59 +08002910/**
2911 * @brief get imei function
2912 * @param [in] len imei length,max is 20
2913 * @param [out] imei return imei from this func
2914 * @retval 0: success
2915 * @retval other: fail
2916 */
2917int gsw_get_imei(int len, char *imei)
2918{
q.huang238b22a2025-06-10 14:36:59 +08002919 if (nw_init_flag == 0 || nw_info_handle == NULL)
2920 {
2921 printf("nw sdk has been deinit\n");
2922 return GSW_HAL_NORMAL_FAIL;
2923 }
2924
2925 if(imei == NULL)
2926 {
q.huang934ec0e2025-07-22 19:56:59 +08002927 LOGE(GSW_NW,"imei is NULL.");
q.huang238b22a2025-06-10 14:36:59 +08002928 return GSW_HAL_ARG_INVALID;
2929 }
2930
2931 if(len < GSW_IMEI_LENGTH)
2932 {
q.huang934ec0e2025-07-22 19:56:59 +08002933 LOGE(GSW_NW,"imei len is too short,len = %d\n", len);
q.huang238b22a2025-06-10 14:36:59 +08002934 return GSW_HAL_NORMAL_FAIL;
2935 }
2936
q.huang861c07d2025-06-24 16:54:58 +08002937 int ret = mbtk_imei_get(nw_info_handle, (void *)imei);
q.huang238b22a2025-06-10 14:36:59 +08002938 if(ret != MBTK_ERR_OK)
2939 {
q.huang934ec0e2025-07-22 19:56:59 +08002940 LOGE(GSW_NW,"[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002941 return GSW_HAL_NORMAL_FAIL;
2942 }
2943
2944 return GSW_HAL_SUCCESS;
2945}
2946
2947/**
2948 * @brief reset modem stack only, notice: after use this method, all ril sdk
2949 * need restart by app, means network, sim, sms, data need deinit then init!
2950 * @param
2951 * @retval 0: success
2952 * @retval other: fail
2953 */
2954int gsw_reset_modem(void)
2955{
2956 int ret = -1;
2957 if (nw_init_flag == 0 || nw_info_handle == NULL)
2958 {
2959 printf("nw sdk has been deinit\n");
2960 return GSW_HAL_NORMAL_FAIL;
2961 }
2962 mbtk_modem_info_t info;
2963 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2964 info.rst = 0;
2965
2966 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2967 if(ret)
2968 {
q.huang934ec0e2025-07-22 19:56:59 +08002969 LOGE(GSW_NW,"[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002970 return GSW_HAL_NORMAL_FAIL;
2971 }
2972
2973 sleep(1);
2974
2975 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2976 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2977 if(ret)
2978 {
q.huang934ec0e2025-07-22 19:56:59 +08002979 LOGE(GSW_NW,"[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002980 return GSW_HAL_NORMAL_FAIL;
2981 }
2982 return GSW_HAL_SUCCESS;
2983}
b.liu68a94c92025-05-24 12:53:41 +08002984
q.huangc8b93122025-06-17 17:46:05 +08002985int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2986{
2987 if (nw_init_flag == 0 || nw_info_handle == NULL)
2988 {
2989 return GSW_HAL_NORMAL_FAIL;
2990 }
q.huang934ec0e2025-07-22 19:56:59 +08002991
2992 void* cb_func;
q.huangc8b93122025-06-17 17:46:05 +08002993 if(handle_ptr == NULL)
2994 {
q.huang934ec0e2025-07-22 19:56:59 +08002995 LOGE(GSW_NW,"reg airplane mode cb is NULL");
2996 cb_func=NULL;
q.huangc8b93122025-06-17 17:46:05 +08002997 }
q.huang934ec0e2025-07-22 19:56:59 +08002998 else
2999 {
3000 cb_func=(void*) gsw_operating_mode_event_callback;
q.huangc8b93122025-06-17 17:46:05 +08003001 }
q.huangc8b93122025-06-17 17:46:05 +08003002
q.huang934ec0e2025-07-22 19:56:59 +08003003 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle, cb_func);
3004
3005 if (ret != 0)
3006 {
3007 LOGE(GSW_NW,"mbtk_radio_state_change_cb_reg fail, ret is %d",ret);
3008 return GSW_HAL_NORMAL_FAIL;
3009 }
3010
3011 airplane_cb = handle_ptr;
3012
3013 if(airplane_cb !=NULL)
3014 {
3015 int opmode;
3016 ret = gsw_get_opmode(&opmode);
3017 if(ret == 0)
3018 {
3019 airplane_cb(opmode);
3020 }
3021 else
3022 {
3023 LOGE(GSW_NW,"gsw_get_opmode fail, ret is%d", ret);
3024 }
3025 }
3026
3027 return GSW_HAL_SUCCESS;
q.huangc8b93122025-06-17 17:46:05 +08003028}
3029
hong.liud2417072025-06-27 07:10:37 -07003030int gsw_get_apn_reserved_id(const char *apn)
3031{
3032 return 0;
3033}
3034
3035int gsw_set_apn_reserved_id(int reserved_id, const char *apn)
3036{
3037 return 0;
3038}
3039
3040int gsw_data_call_clear_session(int linkid, Link_Info_s *LinkInf)
3041{
3042 return 0;
3043}
3044
3045void *gsw_onUnsolicited(void *arg)
3046{
3047 return 0;
3048}
3049
3050int gsw_sdk_init(void)
3051{
3052 return 0;
3053}
3054
3055int gsw_get_modem_state_exp(void)
3056{
3057 return 0;
3058}