blob: 5f83c414cc4d075bc914c1b17a23b274a51b5e8f [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"
rx.xieaad2b6f2025-08-01 00:55:33 -070046#define SDK_READY_CMD "uci get lynq_uci.sdk_ready"
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
q.huang66b79162025-06-27 17:45:34 +08001200
b.liu68a94c92025-05-24 12:53:41 +08001201static void gsw_serving_info_callback_thread()
1202{
q.huang934ec0e2025-07-22 19:56:59 +08001203 GSW_NW_SERVING_INFO serving_info;
1204 int ret = gsw_get_nwinfo(&serving_info);
b.liu68a94c92025-05-24 12:53:41 +08001205 if(ret != 0)
1206 {
q.huang934ec0e2025-07-22 19:56:59 +08001207 LOGE(GSW_NW,"cb gsw_get_nwinfo failed");
b.liu68a94c92025-05-24 12:53:41 +08001208 return;
1209 }
1210
q.huang934ec0e2025-07-22 19:56:59 +08001211 if(serving_cb!=NULL)
b.liu68a94c92025-05-24 12:53:41 +08001212 {
q.huang934ec0e2025-07-22 19:56:59 +08001213 LOGE(GSW_NW,"serving cb called");
1214 serving_cb(serving_info);
1215 }
1216 else
1217 {
1218 LOGE(GSW_NW,"serving cb is NULL");
b.liu68a94c92025-05-24 12:53:41 +08001219 }
1220}
1221
1222static void gsw_serving_info_callback(const void* data, int data_len)
q.huang934ec0e2025-07-22 19:56:59 +08001223{
1224 if (nw_init_flag == 0)
b.liu68a94c92025-05-24 12:53:41 +08001225 {
q.huang934ec0e2025-07-22 19:56:59 +08001226 printf("%s, nw not init\n",__func__);
b.liu68a94c92025-05-24 12:53:41 +08001227 return;
1228 }
q.huang934ec0e2025-07-22 19:56:59 +08001229
1230 pthread_t thread;
1231 int ret=pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1232 if(ret==0)
1233 {
1234 pthread_detach(thread);
1235 }
1236 else
1237 {
1238 LOGE(GSW_NW,"create thread fail, ret is %d",ret);
1239 }
b.liu68a94c92025-05-24 12:53:41 +08001240}
1241
q.huang934ec0e2025-07-22 19:56:59 +08001242
q.huangfa0a0a32025-06-12 17:07:23 +08001243/*typedef struct
q.huang934ec0e2025-07-22 19:56:59 +08001244{
q.huangfa0a0a32025-06-12 17:07:23 +080012450 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
12461 uint8 rssi; // 0: 113 dBm or less
q.huang934ec0e2025-07-22 19:56:59 +08001247 // 1: 111 dBm
1248 // 2��30: 109��53 dBm
1249 // 31: 51 dBm or greater
1250 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012512 uint8 rxlev;// 0:rssi < -110 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001252 // 1: -110 dBm �� rssi < -109 dBm
1253 // 2: -109 dBm �� rssi < -108 dBm
1254 // ......
1255 // 61: -50 dBm �� rssi < -49 dBm
1256 // 62: -49 dBm �� rssi < -48 dBm
1257 // 63: -48 dBm �� rssi
1258 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012593 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 +08001260 // 99 not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012614 uint8 rscp; // 0: rscp < -120 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001262 // 1: -120 dBm �� rscp < -119 dBm
1263 // 2: -119 dBm �� rscp < -118 dBm
1264 // ......
1265 // 94: -27 dBm �� rscp < -26 dBm
1266 // 95: -26 dBm �� rscp < -25 dBm
1267 // 96: - 25 dBm �� rscp
1268 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012695 uint8 ecno; // 0: Ec/Io < -24 dB
q.huang934ec0e2025-07-22 19:56:59 +08001270 // 1: -24 dB �� Ec/Io < -23.5 dB
1271 // 2: -23.5 dB �� Ec/Io < -23 dB
1272 // ......
1273 // 47: -1 dB �� Ec/Io < -0.5 dB
1274 // 48: -0.5 dB �� Ec/Io < 0 dB
1275 // 49: 0 dB �� Ec/Io
1276 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012776 uint8 rsrq; // 0: rsrq < -19.5 dB
q.huang934ec0e2025-07-22 19:56:59 +08001278 // 1: -19.5 dB �� rsrq < -19 dB
1279 // 2: -19 dB �� rsrq < -18.5 dB
1280 // ......
1281 // 32: -4 dB �� rsrq < -3.5 dB
1282 // 33: -3.5 dB �� rsrq < -3 dB
1283 // 34: -3 dB �� rsrq
1284 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012857 uint8 rsrp; // 0: rsrp < -140 dBm
q.huang934ec0e2025-07-22 19:56:59 +08001286 // 1: -140 dBm �� rsrp < -139 dBm
1287 // 2: -139 dBm �� rsrp < -138 dBm
1288 // ......
1289 // 95: -46 dBm �� rsrp < -45 dBm
1290 // 96: -45 dBm �� rsrp < -44 dBm
1291 // 97: -44 dBm �� rsrp
1292 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +080012938 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
q.huang934ec0e2025-07-22 19:56:59 +08001294 // 1: -43 dB <= ss_rsrq < -42.5 dB
1295 // 2: -42.5 dB <= ss_rsrq < -42 dB
1296 // ......
1297 // 125: 19 dB <= ss_rsrq < 19.5 dB
1298 // 126: 19.5 dB <= ss_rsrq < 20 dB
1299 // 255: not known or not detectable
1300 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1301 // 1: -156 dBm <= ss_rsrp < -155 dBm
1302 // 2: -155 dBm <= ss_rsrp < -154 dBm
1303 // ......
1304 // 125: -32 dBm <= ss_rsrp < -31 dBm
1305 // 126: -31 dBm <= ss_rsrp
1306 // 255: not known or not detectable
1307 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1308 // 1: -23 dB  ss_sinr < -22.5 dB
1309 // 2: -22.5 dB  ss_sinr < -22 dB
1310 // ......
1311 // 125: 39 dB  ss_sinr < 39.5 dBm
1312 // 126: 39.5 dB  ss_sinr < 40 dB
1313 // 127: 40 dB  ss_sinr
1314 // 255: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +08001315} __attribute__((packed)) mbtk_signal_info_t;
1316*/
b.liu68a94c92025-05-24 12:53:41 +08001317static void gsw_sig_info_callback(const void* data, int data_len)
1318{
q.huang934ec0e2025-07-22 19:56:59 +08001319 if (nw_init_flag == 0)
1320 {
1321 printf("%s, nw not init\n",__func__);
1322 return;
1323 }
1324
q.huangfa0a0a32025-06-12 17:07:23 +08001325 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001326 {
b.liu68a94c92025-05-24 12:53:41 +08001327 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001328 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1329
b.liu68a94c92025-05-24 12:53:41 +08001330 if(sig_cb != NULL)
1331 {
1332 sig_cb(sig_strength);
1333 }
1334 }
b.liu68a94c92025-05-24 12:53:41 +08001335 else
1336 {
q.huang934ec0e2025-07-22 19:56:59 +08001337 LOGE(GSW_NW,"data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001338 }
1339}
1340
q.huangc8b93122025-06-17 17:46:05 +08001341static void gsw_operating_mode_event_callback(const void* data, int data_len)
b.liu68a94c92025-05-24 12:53:41 +08001342{
q.huang934ec0e2025-07-22 19:56:59 +08001343 if (nw_init_flag == 0)
1344 {
1345 printf("%s nw not init\n",__func__);
1346 return;
1347 }
1348
1349 LOGE(GSW_NW,"gsw_operating_mode_event_callback start\n");
b.liu68a94c92025-05-24 12:53:41 +08001350
q.huangc8b93122025-06-17 17:46:05 +08001351
b.liu68a94c92025-05-24 12:53:41 +08001352 if(data && data_len > 0)
1353 {
q.huangc8b93122025-06-17 17:46:05 +08001354 const uint8 *cfun_state = (const uint8*)data;
q.huang934ec0e2025-07-22 19:56:59 +08001355 LOGE(GSW_NW,"gsw_operating_mode_event_callback,data = %d\n", *cfun_state);
q.huangc8b93122025-06-17 17:46:05 +08001356 if(airplane_cb != NULL)
b.liu68a94c92025-05-24 12:53:41 +08001357 {
q.huangc8b93122025-06-17 17:46:05 +08001358 airplane_cb(*cfun_state);
b.liu68a94c92025-05-24 12:53:41 +08001359 }
1360 }
1361
1362}
1363
q.huangdaa16d42025-07-03 14:32:48 +08001364
b.liu68a94c92025-05-24 12:53:41 +08001365static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1366{
q.huang934ec0e2025-07-22 19:56:59 +08001367 if (nw_init_flag == 0)
1368 {
1369 printf("%s nw not init\n",__func__);
1370 return;
1371 }
b.liu68a94c92025-05-24 12:53:41 +08001372
q.huang934ec0e2025-07-22 19:56:59 +08001373 LOGE(GSW_NW,"gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
b.liu68a94c92025-05-24 12:53:41 +08001374
1375 if(reject_cb != NULL)
1376 {
q.huang934ec0e2025-07-22 19:56:59 +08001377 GSW_NW_REJ_CAUSE_E rej_cause;
1378 rej_cause.rej_cause = cause;
1379 rej_cause.rej_rat = rat;
1380 rej_cause.rej_domain = domain;
1381
1382 LOGE(GSW_NW,"reject_cb called\n");
1383 reject_cb(&rej_cause);
b.liu68a94c92025-05-24 12:53:41 +08001384 }
1385 else
1386 {
q.huang934ec0e2025-07-22 19:56:59 +08001387 LOGE(GSW_NW,"reject_cb is NULL\n");
1388 }
1389}
1390
1391void gsw_serving_info_timer()
1392{
1393 if(nw_init_flag == 0 || nw_info_handle == NULL)
1394 {
1395 return;
b.liu68a94c92025-05-24 12:53:41 +08001396 }
1397
q.huang934ec0e2025-07-22 19:56:59 +08001398 while(nw_init_flag)
1399 {
1400 gsw_serving_info_callback_thread();
1401 sleep(SERVING_TIMER);
1402 }
b.liu68a94c92025-05-24 12:53:41 +08001403}
1404
xy.hec89938f2025-05-29 14:08:47 +08001405void gsw_sig_info_timer()
1406{
xy.hec89938f2025-05-29 14:08:47 +08001407 if(nw_init_flag == 0 || nw_info_handle == NULL)
1408 {
1409 return;
1410 }
1411
1412 mbtk_signal_info_t signal;
1413 signalStrength_t sig_strength;
1414
1415 while(nw_init_flag)
1416 {
q.huangfa0a0a32025-06-12 17:07:23 +08001417 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001418 if(ret != 0)
1419 {
q.huang934ec0e2025-07-22 19:56:59 +08001420 LOGE(GSW_NW,"mbtk_net_signal_get fail, ret is %d\n",ret);
q.huang66b79162025-06-27 17:45:34 +08001421
xy.hec89938f2025-05-29 14:08:47 +08001422 }
xy.hec89938f2025-05-29 14:08:47 +08001423 else
1424 {
q.huangfa0a0a32025-06-12 17:07:23 +08001425 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
q.huang66b79162025-06-27 17:45:34 +08001426 if(sig_cb != NULL)
1427 {
1428 sig_cb(sig_strength);
1429 }
xy.hec89938f2025-05-29 14:08:47 +08001430 }
xy.hec89938f2025-05-29 14:08:47 +08001431 sleep(SIG_TIMER);
1432 }
1433}
1434
q.huangdaa16d42025-07-03 14:32:48 +08001435int get_sdk_ready()
1436{
1437 char buffer[MBTK_READY_STRING_SIZE_MAX];
1438 FILE *fp = popen(SDK_READY_CMD, "r");
1439 if(NULL == fp)
1440 {
q.huang934ec0e2025-07-22 19:56:59 +08001441 LOGE(GSW_NW,"popen sdk ready fail");
q.huangdaa16d42025-07-03 14:32:48 +08001442 return -1;
1443 }
1444 memset(buffer,0,sizeof(buffer));
1445 if(fgets(buffer, sizeof(buffer), fp) == NULL)
1446 {
1447 pclose(fp);
q.huang934ec0e2025-07-22 19:56:59 +08001448 LOGE(GSW_NW,"fgets failed:");
q.huangdaa16d42025-07-03 14:32:48 +08001449 return -1;
1450 }
1451 pclose(fp);
q.huang934ec0e2025-07-22 19:56:59 +08001452 LOGE(GSW_NW,"get_sdk_ready:%s",buffer);
q.huangdaa16d42025-07-03 14:32:48 +08001453 return atoi(buffer);
1454}
1455
rx.xieaad2b6f2025-08-01 00:55:33 -07001456static int g_modem_state = ((int)(GSW_MODEM_STATE_UNKNOWN)) - 1;
1457static int g_gnss_state = ((int)(GSW_MODEM_STATE_UNKNOWN)) - 1;
q.huang66b79162025-06-27 17:45:34 +08001458
q.huang66b79162025-06-27 17:45:34 +08001459void gsw_modem_state_timer()
rx.xieaad2b6f2025-08-01 00:55:33 -07001460{
1461 int modem_state;
1462 int gnss_state;
1463
1464 while (nw_init_flag)
q.huang66b79162025-06-27 17:45:34 +08001465 {
rx.xieaad2b6f2025-08-01 00:55:33 -07001466 int uci_value = get_sdk_ready();
1467 if (uci_value < 0)
q.huang66b79162025-06-27 17:45:34 +08001468 {
rx.xieaad2b6f2025-08-01 00:55:33 -07001469 modem_state = GSW_MODEM_STATE_UNKNOWN;
1470 gnss_state = GSW_SDK_STATE_GPS_DOWN;
1471 }
1472 else
1473 {
1474 if ((uci_value & 0x0F) == 0)
q.huang66b79162025-06-27 17:45:34 +08001475 {
rx.xieaad2b6f2025-08-01 00:55:33 -07001476 modem_state = GSW_MODEM_STATE_ONLINE;
1477 }
1478 else if (uci_value > 0 && uci_value <= 15)
q.huang66b79162025-06-27 17:45:34 +08001479 {
rx.xieaad2b6f2025-08-01 00:55:33 -07001480 modem_state = GSW_MODEM_STATE_OFFLINE;
q.huang66b79162025-06-27 17:45:34 +08001481 }
rx.xieaad2b6f2025-08-01 00:55:33 -07001482 else
1483 {
1484 modem_state = GSW_MODEM_STATE_UNKNOWN;
1485 }
1486
1487 if (uci_value & (1 << 4))
1488 {
1489 gnss_state = GSW_SDK_STATE_GPS_DOWN;
1490 }
1491 else
1492 {
1493 gnss_state = GSW_SDK_STATE_GPS_UP;
1494 }
1495 }
1496
1497 if (modem_cb != NULL)
1498 {
1499
1500 if (modem_state != g_modem_state)
1501 {
1502 LOGE(GSW_NW, "Modem state changed from %d to %d", g_modem_state, modem_state);
1503 modem_cb(modem_state);
1504 g_modem_state = modem_state;
1505 }
1506
1507 if (gnss_state != g_gnss_state)
1508 {
1509 LOGE(GSW_NW, "GNSS state changed from %d to %d", g_gnss_state, gnss_state);
1510 modem_cb(gnss_state);
1511 g_gnss_state = gnss_state;
1512 }
1513 }
1514 sleep(MODEM_TIMER);
q.huang66b79162025-06-27 17:45:34 +08001515 }
1516}
1517
1518
b.liu68a94c92025-05-24 12:53:41 +08001519
1520/**
1521 * @brief SDK interface to call back serving info
1522 * @param [in] handle_ptr
1523 * @retval 0: success
1524 * @retval other: fail
1525 */
1526int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1527{
1528 if (nw_init_flag == 0 || nw_info_handle == NULL)
1529 {
xy.heb41615b2025-05-28 16:33:20 +08001530 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001531 }
1532
q.huang934ec0e2025-07-22 19:56:59 +08001533 void* cb_func;
b.liu68a94c92025-05-24 12:53:41 +08001534 if(handle_ptr == NULL)
1535 {
q.huang934ec0e2025-07-22 19:56:59 +08001536 LOGE(GSW_NW,"serving info handle_ptr is NULL\n");
1537 cb_func=NULL;
1538 }
1539 else
1540 {
1541 cb_func=(void*) gsw_serving_info_callback;
1542 }
1543
1544 int ret = mbtk_net_state_change_cb_reg(nw_info_handle, cb_func);
1545 if (ret != 0)
1546 {
1547 LOGW(GSW_NW,"mbtk_net_state_change_cb_reg fail, ret is %d",ret);
xy.heb41615b2025-05-28 16:33:20 +08001548 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001549 }
q.huang934ec0e2025-07-22 19:56:59 +08001550 serving_cb=handle_ptr;
b.liu68a94c92025-05-24 12:53:41 +08001551 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08001552}
1553
1554
1555/**
1556 * @brief SDK interface to call back sig info
1557 * @param [in] handle_ptr
1558 * @retval 0: success
1559 * @retval other: fail
1560 */
1561int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1562{
1563 if (nw_init_flag == 0 || nw_info_handle == NULL)
1564 {
xy.heb41615b2025-05-28 16:33:20 +08001565 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001566 }
q.huang81905ea2025-07-25 20:19:41 +08001567
q.huang934ec0e2025-07-22 19:56:59 +08001568 void* cb_func;
b.liu68a94c92025-05-24 12:53:41 +08001569 if(handle_ptr == NULL)
1570 {
q.huang934ec0e2025-07-22 19:56:59 +08001571 LOGE(GSW_NW,"serving info handle_ptr is NULL\n");
1572 cb_func=NULL;
1573 }
1574 else
1575 {
1576 cb_func=(void*) gsw_sig_info_callback;
1577 }
1578
1579 int ret = mbtk_signal_state_change_cb_reg(nw_info_handle, cb_func);
1580
1581 if (ret != 0)
1582 {
1583 LOGE(GSW_NW,"mbtk_signal_state_change_cb_reg fail, ret is %d", ret);
1584 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001585 }
1586
1587 sig_cb = handle_ptr;
1588
1589 return GSW_HAL_SUCCESS;
1590
1591}
1592
1593
1594/**
1595 * @brief SDK interface to call back rej cause
1596 * @param [in] handle_ptr
1597 * @retval 0: success
1598 * @retval other: fail
1599 */
1600int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1601{
1602 if (nw_init_flag == 0 || nw_info_handle == NULL)
1603 {
xy.heb41615b2025-05-28 16:33:20 +08001604 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001605 }
1606
1607 if(handle_ptr == NULL)
1608 {
q.huang934ec0e2025-07-22 19:56:59 +08001609 LOGE(GSW_NW,"rej cause handle_ptr is NULL\n");
b.liu68a94c92025-05-24 12:53:41 +08001610 }
1611
1612 reject_cb = handle_ptr;
1613
1614 return GSW_HAL_SUCCESS;
1615}
1616
q.huang81905ea2025-07-25 20:19:41 +08001617static void gsw_un_reg_all()
1618{
1619 gsw_reg_serving_info_callback(NULL);
1620 gsw_reg_sig_info_callback(NULL);
1621 gsw_reg_operating_mode_callback(NULL);
1622 gsw_reg_set_modem_status_event_callback(NULL);
1623 gsw_reg_rej_cause_callback(NULL);
1624}
1625
1626pthread_t s_tid[NW_THEAD_NUM] = {-1,-1,-1};
1627void* s_thread_func[NW_THEAD_NUM]={
1628 (void*)gsw_sig_info_timer,
1629 (void*)gsw_modem_state_timer,
1630 (void*)gsw_serving_info_timer
1631 };
1632
1633static void gsw_close_all_thread()
1634{
1635 int i,ret;
1636
1637
1638 nw_init_flag=0;
1639
1640/* had better not use thread cancel, maybe handle->send_mutex is locked now, cancel will not release this mutex
1641 for(i=0; i<NW_THEAD_NUM; i++)
1642 {
1643 if(s_tid[i]!=-1)
1644 {
1645 ret = pthread_cancel(s_tid[i]);
1646 LOGE(GSW_NW,"pthread %d cancel, ret is %d",i, ret);
1647 }
1648 }
1649*/
1650
1651 for(i=0;i<NW_THEAD_NUM;i++)
1652 {
1653 if(s_tid[i]!=-1)
1654 {
1655 ret = pthread_join(s_tid[i],NULL);
1656 LOGE(GSW_NW,"pthread %d join, ret is %d",i, ret);
1657 s_tid[i]=-1;
1658 }
1659 }
1660}
1661
1662static int gsw_start_all_thread()
1663{
1664 int i,ret;
1665 for(i=0; i<NW_THEAD_NUM;i++)
1666 {
1667 ret = pthread_create(&(s_tid[i]), NULL,s_thread_func[i], NULL);
1668 if (ret != 0)
1669 {
1670 LOGE(GSW_NW,"pthread_create fail %d,ret is %d",i,ret);
1671 gsw_close_all_thread();
1672 return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
1673 }
1674 }
1675
1676 return GSW_HAL_SUCCESS;
1677
1678}
1679
1680
b.liu68a94c92025-05-24 12:53:41 +08001681
1682/**
1683 * @brief network sdk init
1684 * @param [in] token usr id define by who use
1685 * @retval 0: success
1686 * @retval other: fail
1687 */
1688int gsw_nw_sdk_init(int token)
1689{
b.liu68a94c92025-05-24 12:53:41 +08001690 if (nw_init_flag == 1 && nw_info_handle != NULL)
1691 {
1692 return GSW_HAL_SUCCESS;
1693 }
1694
q.huang81905ea2025-07-25 20:19:41 +08001695 int ret = mbtk_nw_api_import();
b.liu68a94c92025-05-24 12:53:41 +08001696 if (ret != 0)
1697 {
q.huang81905ea2025-07-25 20:19:41 +08001698 printf("mbtk_nw_api_import fail");
xy.heb41615b2025-05-28 16:33:20 +08001699 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001700 }
1701
1702 nw_info_handle = mbtk_info_handle_get();
1703
1704 if (nw_info_handle == NULL)
1705 {
q.huang81905ea2025-07-25 20:19:41 +08001706 LOGE(GSW_NW,"mbtk_info_handle_get fail");
xy.heb41615b2025-05-28 16:33:20 +08001707 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001708 }
1709
1710 char fplmn[256] = {0};
1711 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1712 if(ret != 0)
1713 {
q.huang81905ea2025-07-25 20:19:41 +08001714 LOGE(GSW_NW,"mbtk_fplmn_get failed, ret is %d",ret);
xy.heb41615b2025-05-28 16:33:20 +08001715 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001716 }
1717 fplmn_max_length = (strlen(fplmn)/6);
q.huang81905ea2025-07-25 20:19:41 +08001718 LOGE(GSW_NW,"fplmn = %s, fplmn_max_length = %d",fplmn,fplmn_max_length);
b.liu68a94c92025-05-24 12:53:41 +08001719
q.huang66b79162025-06-27 17:45:34 +08001720 nw_init_flag = 1;
q.huang81905ea2025-07-25 20:19:41 +08001721 ret=gsw_start_all_thread();
q.huang66b79162025-06-27 17:45:34 +08001722
q.huang81905ea2025-07-25 20:19:41 +08001723 if(ret != 0)
xy.hec89938f2025-05-29 14:08:47 +08001724 {
q.huang81905ea2025-07-25 20:19:41 +08001725 nw_init_flag = 0;
1726 LOGE(GSW_NW,"gsw_start_all_thread failed , ret is %d",ret);
1727 return GSW_HAL_NORMAL_FAIL;
xy.hec89938f2025-05-29 14:08:47 +08001728 }
1729
q.huang81905ea2025-07-25 20:19:41 +08001730 LOGE(GSW_NW,"gsw nw init suc");
b.liu68a94c92025-05-24 12:53:41 +08001731
1732 return GSW_HAL_SUCCESS;
1733}
1734
1735
1736/**
1737 * @brief network sdk deinit
1738 * @param
1739 * @retval 0: success
1740 * @retval other: fail
1741 */
1742int gsw_nw_sdk_deinit(void)
1743{
1744 int ret = -1;
1745
1746 if (nw_init_flag == 0 || nw_info_handle == NULL)
1747 {
xy.heb41615b2025-05-28 16:33:20 +08001748 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001749 }
1750
q.huang81905ea2025-07-25 20:19:41 +08001751 gsw_un_reg_all();// had better un-reg before thread close
1752 gsw_close_all_thread();//in it, nw_init_flag=0 and cb unreg
1753
b.liu68a94c92025-05-24 12:53:41 +08001754 ret = mbtk_info_handle_free(&nw_info_handle);
1755 if(ret != GSW_HAL_SUCCESS)
1756 {
q.huang81905ea2025-07-25 20:19:41 +08001757 LOGE(GSW_NW,"mbtk_info_handle_free fail");
xy.heb41615b2025-05-28 16:33:20 +08001758 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001759 }
1760
1761 dlclose(dlHandle_mbtk);
1762 nw_info_handle = NULL;
q.huang81905ea2025-07-25 20:19:41 +08001763
1764 LOGE(GSW_NW,"gsw_nw_sdk_deinit suc");
b.liu68a94c92025-05-24 12:53:41 +08001765
1766 return GSW_HAL_SUCCESS;
1767
1768}
1769
1770
1771/**
1772 * @brief get current network reg info
1773 * @param [out] serving_info struct for network info
1774 * include regstate ps_state opreator name mcc mcn etc
1775 * @retval 0: success
1776 * @retval other: fail
1777 */
1778int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1779{
1780
1781 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001782 if (nw_init_flag == 0 || nw_info_handle == NULL)
1783 {
q.huang238b22a2025-06-10 14:36:59 +08001784 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001785 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001786 }
1787
q.huang934ec0e2025-07-22 19:56:59 +08001788 LOGE(GSW_NW,"mbtk_net_reg_get start \n");
b.liu68a94c92025-05-24 12:53:41 +08001789 //regstate
1790 mbtk_net_reg_info_t reg;
b.liu68a94c92025-05-24 12:53:41 +08001791 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1792 if(ret)
1793 {
q.huang934ec0e2025-07-22 19:56:59 +08001794 LOGE(GSW_NW,"mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001795 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001796 }
1797
q.huang934ec0e2025-07-22 19:56:59 +08001798 LOGE(GSW_NW,"convert_cs_reg_state\n");
b.liu68a94c92025-05-24 12:53:41 +08001799 //cs_state
1800 serving_info->reg_state = convert_reg_state(reg.call_state);
q.huang934ec0e2025-07-22 19:56:59 +08001801 LOGE(GSW_NW,"convert_ps_reg_state\n");
b.liu68a94c92025-05-24 12:53:41 +08001802 //ps_state
1803 serving_info->ps_state = convert_reg_state(reg.data_state);
q.huang934ec0e2025-07-22 19:56:59 +08001804 LOGE(GSW_NW,"convert_rat_mode\n");
b.liu68a94c92025-05-24 12:53:41 +08001805 //reg_rat
1806 serving_info->reg_rat = convert_net_mode(reg.type);
1807 //srv_domain
1808 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1809 {
1810 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1811 {
1812 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1813 }
1814
1815 else
1816 {
1817 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1818 }
1819 }
1820
1821 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1822 {
1823 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1824 }
1825
1826 else
1827 {
1828 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1829 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1830 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1831 }
1832
q.huang934ec0e2025-07-22 19:56:59 +08001833 LOGD(GSW_NW,"roaming_ind\n");
b.liu68a94c92025-05-24 12:53:41 +08001834 //roaming_ind
1835 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1836 {
1837 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1838 }
1839 else
1840 {
1841 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1842 }
1843
q.huang934ec0e2025-07-22 19:56:59 +08001844 LOGD(GSW_NW,"reject\n");
b.liu68a94c92025-05-24 12:53:41 +08001845 //reject
1846 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1847 {
q.huang934ec0e2025-07-22 19:56:59 +08001848 LOGD(GSW_NW,"reject_callback\n");
b.liu68a94c92025-05-24 12:53:41 +08001849 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1850 }
1851
q.huang934ec0e2025-07-22 19:56:59 +08001852 LOGD(GSW_NW,"reg_plmn / operator name\n");
b.liu68a94c92025-05-24 12:53:41 +08001853 //reg_plmn / operator name
1854 mbtk_net_info_t net;
q.huang934ec0e2025-07-22 19:56:59 +08001855 LOGD(GSW_NW,"mbtk_net_sel_mode_get start \n");
b.liu68a94c92025-05-24 12:53:41 +08001856 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
q.huang934ec0e2025-07-22 19:56:59 +08001857 LOGD(GSW_NW,"mbtk_net_sel_mode_get end \n");
b.liu68a94c92025-05-24 12:53:41 +08001858 if(ret == 0 && net.plmn > 0)
1859 {
1860 int i = 0;
1861
q.huang934ec0e2025-07-22 19:56:59 +08001862 LOGD(GSW_NW,"start to find mcc");
b.liu68a94c92025-05-24 12:53:41 +08001863 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1864 {
1865 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1866 {
q.huang934ec0e2025-07-22 19:56:59 +08001867 LOGD(GSW_NW,"find mcc\n");
b.liu68a94c92025-05-24 12:53:41 +08001868 break;
1869 }
1870 i++;
1871 }
1872
1873
1874 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1875 {
q.huang934ec0e2025-07-22 19:56:59 +08001876 LOGD(GSW_NW,"not find mcc");
b.liu68a94c92025-05-24 12:53:41 +08001877 strcpy(serving_info->operator_name, "unknown");
hong.liud2417072025-06-27 07:10:37 -07001878 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001879 }
1880
1881 else
1882 {
q.huang934ec0e2025-07-22 19:56:59 +08001883 LOGD(GSW_NW,"find mcc\n");
b.liu68a94c92025-05-24 12:53:41 +08001884 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
hong.liud2417072025-06-27 07:10:37 -07001885 sprintf(serving_info->reg_plmn, "%u", net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08001886 }
1887
q.huang934ec0e2025-07-22 19:56:59 +08001888 LOGE(GSW_NW,"operator_name = %s\n", serving_info->operator_name);
1889 LOGE(GSW_NW,"reg_plmn = %s\n", serving_info->reg_plmn);
b.liu68a94c92025-05-24 12:53:41 +08001890 }
1891
1892
q.huang934ec0e2025-07-22 19:56:59 +08001893 LOGD(GSW_NW,"get cell id/tac/lac/sid/nid\n");
b.liu68a94c92025-05-24 12:53:41 +08001894 //cell id/tac/lac/sid/nid
1895 mbtk_cell_type_enum cell_type;
b.liu68a94c92025-05-24 12:53:41 +08001896 list_node_t* cell_list = NULL;
1897
q.huang934ec0e2025-07-22 19:56:59 +08001898 LOGD(GSW_NW,"mbtk_cell_get start\n");
b.liu68a94c92025-05-24 12:53:41 +08001899 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1900 if(ret != 0 || cell_list == NULL)
1901 {
q.huang934ec0e2025-07-22 19:56:59 +08001902 LOGE(GSW_NW,"mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001903 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001904 }
1905 else
1906 {
q.huang934ec0e2025-07-22 19:56:59 +08001907 LOGE(GSW_NW,"mbtk_cell_get end,start to get node\n");
b.liu68a94c92025-05-24 12:53:41 +08001908 list_first(cell_list);
q.huang934ec0e2025-07-22 19:56:59 +08001909 LOGE(GSW_NW,"list_first end\n");
b.liu68a94c92025-05-24 12:53:41 +08001910 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1911 if(cell)
1912 {
q.huang934ec0e2025-07-22 19:56:59 +08001913 LOGE(GSW_NW,"cell is not null,value2 = %u\n",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001914 switch(cell_type)
1915 {
1916 case MBTK_CELL_TYPE_LTE:
1917 {
q.huang934ec0e2025-07-22 19:56:59 +08001918 LOGE(GSW_NW,"is lte\n");
1919 //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);
1920 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 -07001921 snprintf(serving_info->tac,sizeof(serving_info->tac),"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001922 strcpy(serving_info->lac,"");
hong.liud2417072025-06-27 07:10:37 -07001923 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%u",cell->value10);
b.liu68a94c92025-05-24 12:53:41 +08001924 break;
1925 }
1926
1927 case MBTK_CELL_TYPE_GSM:
1928 {
q.huang934ec0e2025-07-22 19:56:59 +08001929 LOGE(GSW_NW,"is gsm\n");
1930 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 -07001931 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001932 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001933 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001934 break;
1935 }
1936 case MBTK_CELL_TYPE_UMTS:
1937 {
q.huang934ec0e2025-07-22 19:56:59 +08001938 LOGE(GSW_NW,"is wcdma\n");
1939 LOGE(GSW_NW,"UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
hong.liud2417072025-06-27 07:10:37 -07001940 sprintf(serving_info->lac,"%u",cell->value1);
b.liu68a94c92025-05-24 12:53:41 +08001941 memset(serving_info->tac,0,sizeof(serving_info->tac));
hong.liud2417072025-06-27 07:10:37 -07001942 sprintf(serving_info->cell_id,"%u",cell->value2);
b.liu68a94c92025-05-24 12:53:41 +08001943 break;
1944 }
1945
1946 default:
1947 break;
1948 }
1949 }
1950 else
1951 {
q.huang934ec0e2025-07-22 19:56:59 +08001952 LOGE(GSW_NW,"cell is null\n");
b.liu68a94c92025-05-24 12:53:41 +08001953 }
1954 }
1955
1956 //not support now
1957 serving_info->sid = 0;
1958 serving_info->nid = 0;
1959
1960 return GSW_HAL_SUCCESS;
1961}
1962
1963
1964/**
1965 * @brief get current network type
1966 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1967 * @retval 0: success
1968 * @retval other: fail
1969 */
hong.liud2417072025-06-27 07:10:37 -07001970int gsw_get_netype(int32_t *netype)
b.liu68a94c92025-05-24 12:53:41 +08001971{
1972 int ret = -1;
1973
1974 if (nw_init_flag == 0 || nw_info_handle == NULL)
1975 {
xy.heb41615b2025-05-28 16:33:20 +08001976 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001977 }
1978
1979 //regstate
1980 mbtk_net_reg_info_t reg;
1981 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1982 if(ret)
1983 {
q.huang934ec0e2025-07-22 19:56:59 +08001984 LOGE(GSW_NW,"mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001985 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001986 }
1987
1988 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1989 {
1990 *netype = convert_net_mode(reg.type);
1991 }
1992 else
1993 {
1994 *netype = GSW_NETWORK_RADIO_NO_SVC;
1995 }
1996
1997 return GSW_HAL_SUCCESS;
1998}
1999
2000
2001/**
2002 * @brief get radio opmode, as open and close airplane mode
2003 * @param [out] op_mode 1 is radio on, 0 is radio off
2004 * @retval 0: success
2005 * @retval other: fail
2006 */
2007int gsw_get_opmode(int *op_mode)
2008{
2009 int tmp_rf = -1;
2010 int ret = -1;
2011 if (nw_init_flag == 0 || nw_info_handle == NULL)
2012 {
xy.heb41615b2025-05-28 16:33:20 +08002013 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002014 }
2015
2016 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
2017 if (ret != 0)
2018 {
q.huang934ec0e2025-07-22 19:56:59 +08002019 LOGE(GSW_NW,"mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002020 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002021 }
2022 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
2023 {
2024 *op_mode = GSW_OP_MODE_LPM;
2025 }
2026
2027 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
2028 {
2029 *op_mode = GSW_OP_MODE_OFFLINE;
2030 }
2031
2032 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
2033 {
2034 *op_mode = GSW_OP_MODE_ONLINE;
2035 }
2036
2037 return GSW_HAL_SUCCESS;
2038}
2039
2040
2041
2042/**
2043 * @brief set radio opmode, as open and close airplane mode
2044 * @param [in] op_mode 1 is radio on, 0 is radio off
2045 * @retval 0: success
2046 * @retval other: fail
2047 */
hong.liud2417072025-06-27 07:10:37 -07002048int gsw_set_opmode(int32_t op_mode)
b.liu68a94c92025-05-24 12:53:41 +08002049{
2050 mbtk_modem_info_t info;
2051 int rf_mode = -1;
2052 int ret = -1;
2053
2054 if (nw_init_flag == 0 || nw_info_handle == NULL)
2055 {
xy.heb41615b2025-05-28 16:33:20 +08002056 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002057 }
2058
2059 if(op_mode == GSW_OP_MODE_LPM)
2060 {
2061 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
2062 }
2063
2064 if(op_mode == GSW_OP_MODE_ONLINE)
2065 {
2066 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
2067 }
2068
2069 if(op_mode == GSW_OP_MODE_OFFLINE)
2070 {
2071 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
2072 }
2073
2074 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
2075 {
q.huang934ec0e2025-07-22 19:56:59 +08002076 LOGE(GSW_NW,"Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002077 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002078 }
2079
2080 info.fun = rf_mode;
2081 info.rst = 0;
2082 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2083 if (ret != 0)
2084 {
q.huang934ec0e2025-07-22 19:56:59 +08002085 LOGE(GSW_NW,"gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002086 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002087 }
2088
2089 return GSW_HAL_SUCCESS;
2090
2091}
2092
2093
2094/**
2095 * @brief get network mode preference of mdm search network scale
2096 * @param [out] mode_pref net_work pref mode:
2097 * enum prefer_mode
2098 * @retval 0: success
2099 * @retval other: fail
2100 */
hong.liud2417072025-06-27 07:10:37 -07002101int gsw_get_mode_preference(int32_t *mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002102{
2103 if (nw_init_flag == 0 || nw_info_handle == NULL)
2104 {
xy.heb41615b2025-05-28 16:33:20 +08002105 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002106 }
2107
2108 int ret = -1;
2109 mbtk_band_info_t band;
2110 memset(&band, 0, sizeof(mbtk_band_info_t));
2111
2112 ret = mbtk_current_band_get(nw_info_handle, &band);
2113 if(ret != 0)
2114 {
q.huang934ec0e2025-07-22 19:56:59 +08002115 LOGE(GSW_NW,"mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002116 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002117 }
2118
2119 *mode_pref = convert_gsw_net_config(band.net_pref);
q.huang934ec0e2025-07-22 19:56:59 +08002120 LOGE(GSW_NW,"band.net_pref = %d\n", *mode_pref);
b.liu68a94c92025-05-24 12:53:41 +08002121 if(*mode_pref <= 0)
2122 {
q.huang934ec0e2025-07-22 19:56:59 +08002123 LOGE(GSW_NW,"no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002124 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002125 }
2126 return GSW_HAL_SUCCESS;
2127
2128
2129}
2130
2131/**
2132 * @brief set network mode preference of mdm search network scale
2133 * @param [in] mode_pref net_work pref mode:
2134 * enum prefer_mode
2135 * @retval 0: success
2136 * @retval other: fail
2137 */
hong.liud2417072025-06-27 07:10:37 -07002138int gsw_set_mode_preference(int32_t mode_pref)
b.liu68a94c92025-05-24 12:53:41 +08002139{
2140 if (nw_init_flag == 0 || nw_info_handle == NULL)
2141 {
xy.heb41615b2025-05-28 16:33:20 +08002142 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002143 }
2144
2145 int ret = -1;
2146
2147 mbtk_band_info_t band;
2148 memset(&band, 0, sizeof(mbtk_band_info_t));
2149
2150 band.net_pref = convert_mbtk_net_config(mode_pref);
q.huang934ec0e2025-07-22 19:56:59 +08002151 LOGE(GSW_NW,"band.net_pref = %d\n", band.net_pref);
b.liu68a94c92025-05-24 12:53:41 +08002152
2153 if(band.net_pref < 0)
2154 {
q.huang934ec0e2025-07-22 19:56:59 +08002155 LOGE(GSW_NW,"no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002156 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002157 }
2158
2159 ret = mbtk_current_band_set(nw_info_handle, &band);
2160 if(ret != 0)
2161 {
q.huang934ec0e2025-07-22 19:56:59 +08002162 LOGE(GSW_NW,"mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002163 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002164 }
2165
2166 return GSW_HAL_SUCCESS;
2167}
2168
2169/**
2170 * @brief get signal csq value
2171 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
2172 * @retval 0: success
2173 * @retval other: fail
2174 */
hong.liud2417072025-06-27 07:10:37 -07002175int gsw_get_sig_info(int32_t *csq_value)
b.liu68a94c92025-05-24 12:53:41 +08002176{
b.liu68a94c92025-05-24 12:53:41 +08002177 if (nw_init_flag == 0 || nw_info_handle == NULL)
2178 {
xy.heb41615b2025-05-28 16:33:20 +08002179 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002180 }
2181
q.huangdaa16d42025-07-03 14:32:48 +08002182 mbtk_signal_info_t signal;
q.huangfa0a0a32025-06-12 17:07:23 +08002183 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08002184 if(ret != 0)
2185 {
q.huang934ec0e2025-07-22 19:56:59 +08002186 LOGE(GSW_NW,"mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002187 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002188 }
2189
q.huang934ec0e2025-07-22 19:56:59 +08002190 LOGD(GSW_NW,"signal.type=%d\n", signal.type);
b.liu68a94c92025-05-24 12:53:41 +08002191 switch(signal.type)
2192 {
q.huangfa0a0a32025-06-12 17:07:23 +08002193
b.liu68a94c92025-05-24 12:53:41 +08002194 case MBTK_RADIO_TECH_E_UTRAN:
2195 {
q.huang934ec0e2025-07-22 19:56:59 +08002196 LOGD(GSW_NW,"lte rsrp = %d dbm",signal.rsrp-141);
q.huangfa0a0a32025-06-12 17:07:23 +08002197 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08002198 break;
2199 }
2200 case MBTK_RADIO_TECH_UTRAN:
2201 case MBTK_RADIO_TECH_UTRAN_HSDPA:
2202 case MBTK_RADIO_TECH_UTRAN_HSUPA:
2203 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
2204 case MBTK_RADIO_TECH_UTRAN_HSPA:
2205 {
q.huang934ec0e2025-07-22 19:56:59 +08002206 LOGD(GSW_NW,"w rscp = %d dbm",signal.rscp-121);
q.huangfa0a0a32025-06-12 17:07:23 +08002207 *csq_value = rscpToLevel(signal.rscp-121);
2208 break;
2209 }
2210 case MBTK_RADIO_TECH_GSM:
2211 case MBTK_RADIO_TECH_GSM_COMPACT:
2212 case MBTK_RADIO_TECH_GSM_EGPRS:
2213 {
q.huang934ec0e2025-07-22 19:56:59 +08002214 LOGD(GSW_NW,"gsm rxlev = %d (0-63)",signal.rxlev);
q.huang861c07d2025-06-24 16:54:58 +08002215 *csq_value = rxlevToLevel(signal.rxlev);
b.liu68a94c92025-05-24 12:53:41 +08002216 break;
2217 }
2218 default:
2219 {
q.huang934ec0e2025-07-22 19:56:59 +08002220 LOGE(GSW_NW,"[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08002221 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002222 }
2223 }
2224 return GSW_HAL_SUCCESS;
2225}
2226
2227/**
2228 * @brief set nework power mode, for tcam enter standby or exit standby
2229 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
2230 * @retval 0: success
2231 * @retval other: fail
2232 */
lichengzhang0ba58962025-07-15 17:39:03 +08002233
2234int gsw_nw_power_mode = 0;
b.liu68a94c92025-05-24 12:53:41 +08002235int gsw_network_set_power_mode(char mode)
2236{
lichengzhang640b4f82025-07-21 16:19:33 +08002237 int ret = -1;
2238 if (nw_init_flag == 0)//nw_info_handle == NULL Don't need
b.liu68a94c92025-05-24 12:53:41 +08002239 {
xy.heb41615b2025-05-28 16:33:20 +08002240 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002241 }
2242
2243 if(mode != 0 && mode != 1)
2244 {
q.huang934ec0e2025-07-22 19:56:59 +08002245 LOGE(GSW_NW,"Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002246 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002247 }
2248
2249 if(mode == 1)
lichengzhang0ba58962025-07-15 17:39:03 +08002250 gsw_nw_power_mode = 3;
2251 else
2252 gsw_nw_power_mode = 1;
q.huang934ec0e2025-07-22 19:56:59 +08002253
2254 LOGE(GSW_NW,"mode is %d\n",gsw_nw_power_mode);
lichengzhang640b4f82025-07-21 16:19:33 +08002255 ret = mbtk_wakeup_state_set(nw_info_handle, gsw_nw_power_mode);
2256 if(ret != 0)
2257 {
q.huang934ec0e2025-07-22 19:56:59 +08002258 LOGE(GSW_NW,"mbtk_wakeup_state_set fail\n");
lichengzhang640b4f82025-07-21 16:19:33 +08002259 return GSW_HAL_NORMAL_FAIL;
2260 }
b.liu68a94c92025-05-24 12:53:41 +08002261
2262 return GSW_HAL_SUCCESS;
2263
b.liu68a94c92025-05-24 12:53:41 +08002264}
2265
2266/**
2267 * @brief convert rsrp rscp rssi to csq value.
2268 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2269 * @param [in] sigvalue input signal_strength for different nettype
2270 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2271
2272 * @retval csq
2273 * @retval other: fail
2274 */
hong.liud2417072025-06-27 07:10:37 -07002275int gsw_sigInfo_to_csq(int32_t netType, int32_t sigValue)
b.liu68a94c92025-05-24 12:53:41 +08002276{
q.huang238b22a2025-06-10 14:36:59 +08002277 if (nw_init_flag == 0 || nw_info_handle == NULL)
2278 {
2279 return GSW_HAL_NORMAL_FAIL;
2280 }
b.liu68a94c92025-05-24 12:53:41 +08002281 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002282 {
2283 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002284 {
q.huangfa0a0a32025-06-12 17:07:23 +08002285 return rsrpToLevel(sigValue);
2286 }
2287 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002288 {
q.huangfa0a0a32025-06-12 17:07:23 +08002289 return rscpToLevel(sigValue);
2290 }
2291 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002292 {
q.huangfa0a0a32025-06-12 17:07:23 +08002293 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002294 }
2295
2296 default:
2297 {
q.huang934ec0e2025-07-22 19:56:59 +08002298 LOGE(GSW_NW,"parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002299 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002300 }
2301 }
2302}
2303
2304/*
2305 * @brief get mobile operator name
2306 @param [out] nw_operator_name_infos get the long and short operator name info
2307 @retval 0: success
2308 @retval 0: other: fail
2309 */
2310int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2311{
2312 char OperatorFN[128];
2313 char OperatorSH[128];
hong.liud2417072025-06-27 07:10:37 -07002314 char temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002315 mbtk_net_info_t net;
2316
2317 if (nw_init_flag == 0 || nw_info_handle == NULL)
2318 {
xy.heb41615b2025-05-28 16:33:20 +08002319 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002320 }
2321
2322 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2323 {
q.huang934ec0e2025-07-22 19:56:59 +08002324 LOGE(GSW_NW,"Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
b.liu68a94c92025-05-24 12:53:41 +08002325 int i = 0;
2326 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2327 {
2328 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2329 break;
2330 i++;
2331 }
2332
2333 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2334 {
2335 strcpy(OperatorFN, "UNKNOWN");
2336 strcpy(OperatorSH, "UNKNOWN");
2337 }
2338 else
2339 {
2340 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2341 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2342
q.huangdaa16d42025-07-03 14:32:48 +08002343
hong.liud2417072025-06-27 07:10:37 -07002344 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
b.liu68a94c92025-05-24 12:53:41 +08002345 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2346
q.huangdaa16d42025-07-03 14:32:48 +08002347
hong.liud2417072025-06-27 07:10:37 -07002348 sprintf(temp, "%u", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
b.liu68a94c92025-05-24 12:53:41 +08002349 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2350 }
2351
2352 memset(nw_operator_name_infos->long_eons,0,128);
2353 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2354 memset(nw_operator_name_infos->short_eons,0,128);
2355 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2356
2357 return GSW_HAL_SUCCESS;
2358 }
2359
2360 else
2361 {
q.huang934ec0e2025-07-22 19:56:59 +08002362 LOGE(GSW_NW,"mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002363 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002364 }
2365
2366 return GSW_HAL_SUCCESS;
2367}
2368
2369
2370/*
2371 * @brief get current serving cell info
2372 * @param cell_info: [out] struct for current cell info
2373 * include earfcn mcc mnc pci psc tac lac etc.
2374 * @return int: 0 is success, other failed
2375 */
2376int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2377{
b.liu68a94c92025-05-24 12:53:41 +08002378
2379 if (nw_init_flag == 0 || nw_info_handle == NULL)
2380 {
q.huang238b22a2025-06-10 14:36:59 +08002381 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002382 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002383 }
2384
2385 list_node_t* cell_list = NULL;
b.liu68a94c92025-05-24 12:53:41 +08002386 mbtk_cell_type_enum type;
q.huang638d5872025-06-21 13:44:43 +08002387 int ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
b.liu68a94c92025-05-24 12:53:41 +08002388 if(ret || cell_list == NULL) {
q.huang934ec0e2025-07-22 19:56:59 +08002389 LOGE(GSW_NW,"mbtk_cell_get failed : %d\n", ret);
q.huang638d5872025-06-21 13:44:43 +08002390 list_free(cell_list);
2391 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002392 } else {
q.huang638d5872025-06-21 13:44:43 +08002393 memset(cell_info,0,sizeof(GSW_NW_CELL_INFO));
b.liu68a94c92025-05-24 12:53:41 +08002394 list_first(cell_list);
2395 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2396 if(cell) { // Current server cell.
2397 switch(type)
2398 {
2399 case 0:
2400 {
q.huang934ec0e2025-07-22 19:56:59 +08002401 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 +08002402 char gsm_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002403
2404 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2405
2406 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002407 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002408 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2409
b.liu68a94c92025-05-24 12:53:41 +08002410 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002411 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value6);
b.liu68a94c92025-05-24 12:53:41 +08002412 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2413
2414 cell_info->cell_id_valid = 1;
2415 cell_info->cell_id = cell->value2;
2416
2417 cell_info->lac_valid = 1;
2418 cell_info->lac = cell->value1;
2419
2420 cell_info->arfcn_valid = 1;
2421 cell_info->arfcn = cell->value3;
q.huang861c07d2025-06-24 16:54:58 +08002422
2423 cell_info->rssi=rxlev_convert_to_rssi_dBm(cell->value7);
2424 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002425 break;
2426 }
2427
2428 case 1:
2429 {
q.huang934ec0e2025-07-22 19:56:59 +08002430 LOGD(GSW_NW,"UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
q.huangdaa16d42025-07-03 14:32:48 +08002431 char wcdma_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002432
2433 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2434
2435 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002436 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value4);
b.liu68a94c92025-05-24 12:53:41 +08002437 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2438
b.liu68a94c92025-05-24 12:53:41 +08002439 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002440 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002441 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2442
2443 cell_info->lac_valid = 1;
2444 cell_info->lac = cell->value1;
2445
2446 cell_info->cell_id_valid = 1;
2447 cell_info->cell_id = cell->value2;
2448
2449 cell_info->uarfcn_valid = 1;
2450 cell_info->uarfcn = cell->value3;
2451
2452 cell_info->psc_valid = 1;
2453 cell_info->psc = cell->value6;
2454 break;
2455 }
2456
2457 case 2:
2458 {
q.huang934ec0e2025-07-22 19:56:59 +08002459 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 +08002460
q.huangdaa16d42025-07-03 14:32:48 +08002461 char lte_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002462 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2463
2464 cell_info->mcc_valid = 1;
2465 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2466 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2467
b.liu68a94c92025-05-24 12:53:41 +08002468 cell_info->mnc_valid = 1;
2469 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2470 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2471
2472 cell_info->tac_valid = 1;
2473 cell_info->tac = cell->value1;
2474
2475 cell_info->pci_valid = 1;
2476 cell_info->pci = cell->value2;
2477
2478 cell_info->earfcn_valid = 1;
2479 cell_info->earfcn = cell->value3;
2480
2481 cell_info->bler_valid = 1;
2482 cell_info->bler = cell->value4;
2483
2484 cell_info->band_valid = 1;
2485 cell_info->band = cell->value5;
2486
q.huang638d5872025-06-21 13:44:43 +08002487 cell_info->rssnr = sinr_convert_to_10_times_dB(cell->value11);
2488 cell_info->rssnr_valid=(cell_info->rssnr!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002489
q.huang638d5872025-06-21 13:44:43 +08002490 cell_info->lteMode_valid = 1;
2491 cell_info->lteMode =(!(cell->value12));
2492
2493
2494 cell_info->rsrp = rsrp_convert_to_minus_dBm(cell->value8);
2495 cell_info->rsrp_valid = (cell_info->rsrp!=INT_32_MAX);
2496
2497 cell_info->rsrq = rsrq_convert_to_minus_dB(cell->value9);
2498 cell_info->rsrq_valid = (cell_info->rsrq!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002499
2500 cell_info->cell_id_valid = 1;
2501 cell_info->cell_id = cell->value10;
2502
q.huang638d5872025-06-21 13:44:43 +08002503 cell_info->rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->rsrp);
2504 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
2505
b.liu68a94c92025-05-24 12:53:41 +08002506 break;
2507 }
2508
2509 default:
2510 break;
2511 }
2512 }
q.huang638d5872025-06-21 13:44:43 +08002513 int neibor_count = 0;
b.liu68a94c92025-05-24 12:53:41 +08002514 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2515 {
2516 switch(type)
2517 {
2518 //GSM
2519 case 0:
2520 {
2521
2522 }
2523 //WCDMA
2524 case 1:
2525 {
q.huang934ec0e2025-07-22 19:56:59 +08002526 LOGE(GSW_NW,"CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
b.liu68a94c92025-05-24 12:53:41 +08002527
2528 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2529
2530 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2531 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2532
2533 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2534 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2535
2536 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2537
2538 neibor_count++;
2539
2540 }
2541 //LTE
2542 case 2:
2543 {
q.huang934ec0e2025-07-22 19:56:59 +08002544 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 +08002545 char lte_temp[12] = {0};
2546 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2547
q.huangdaa16d42025-07-03 14:32:48 +08002548
b.liu68a94c92025-05-24 12:53:41 +08002549 cell_info->ext_info[neibor_count].pci = cell->value1;
2550 cell_info->ext_info[neibor_count].pci_valid = 1;
2551
2552 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2553 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2554
q.huang638d5872025-06-21 13:44:43 +08002555 cell_info->ext_info[neibor_count].rsrp = rsrp_convert_to_minus_dBm(cell->value3);
2556 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 +08002557
q.huang638d5872025-06-21 13:44:43 +08002558 cell_info->ext_info[neibor_count].rsrq = rsrq_convert_to_minus_dB(cell->value4);
2559 cell_info->ext_info[neibor_count].rsrq_valid = (cell_info->ext_info[neibor_count].rsrq!=INT_32_MAX);
2560
2561 if(cell->value7!=INT_32_MAX)
2562 {
2563 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2564 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2565
2566 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2567 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 +08002568
b.liu68a94c92025-05-24 12:53:41 +08002569
q.huang638d5872025-06-21 13:44:43 +08002570 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2571 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mnc));
2572
2573
2574 //value 8 is tac
b.liu68a94c92025-05-24 12:53:41 +08002575
q.huang638d5872025-06-21 13:44:43 +08002576 cell_info->ext_info[neibor_count].band = cell->value9;
2577 cell_info->ext_info[neibor_count].band_valid = 1;
2578
2579 cell_info->ext_info[neibor_count].rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->ext_info[neibor_count].rsrp);
2580 cell_info->ext_info[neibor_count].rssi_valid = (cell_info->ext_info[neibor_count].rssi!=INT_32_MAX);
2581 }
b.liu68a94c92025-05-24 12:53:41 +08002582
2583 neibor_count++;
2584 }
2585
2586 default:
2587 break;
2588 }
2589 }
q.huang638d5872025-06-21 13:44:43 +08002590 cell_info->ext_info_len=neibor_count;
b.liu68a94c92025-05-24 12:53:41 +08002591 }
2592 list_free(cell_list);
2593
2594 return GSW_HAL_SUCCESS;
2595}
2596
2597/*
2598 * @brief set modem status event callback
2599 @param [in] handle_ptr callback function address
2600 @retval 0: success
2601 @retval 0: other: fail
2602 */
2603int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2604{
2605
2606 if (nw_init_flag == 0 || nw_info_handle == NULL)
2607 {
xy.heb41615b2025-05-28 16:33:20 +08002608 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002609 }
2610
b.liu68a94c92025-05-24 12:53:41 +08002611 if(handle_ptr == NULL)
2612 {
q.huang934ec0e2025-07-22 19:56:59 +08002613 LOGE(GSW_NW,"reg modem state cb, handle_ptr is NULL\n");
b.liu68a94c92025-05-24 12:53:41 +08002614 }
2615
2616 modem_cb = handle_ptr;
2617
b.liu68a94c92025-05-24 12:53:41 +08002618 return GSW_HAL_SUCCESS;
b.liu68a94c92025-05-24 12:53:41 +08002619}
2620
2621
2622/*
2623 * @brief get PLMNs from the FPLMN list
2624 * @param [inout] plmn_list:
2625 * @retval 0: success
2626 * @retval other: fail
2627 */
2628int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2629{
2630 if (nw_init_flag == 0 || nw_info_handle == NULL)
2631 {
xy.heb41615b2025-05-28 16:33:20 +08002632 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002633 }
2634
2635 int ret = -1;
2636 char fplmn[256] = {0};
q.huang934ec0e2025-07-22 19:56:59 +08002637 LOGE(GSW_NW,"mbtk_fplmn_get enter\n");
b.liu68a94c92025-05-24 12:53:41 +08002638 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
q.huang934ec0e2025-07-22 19:56:59 +08002639 LOGE(GSW_NW,"mbtk_fplmn_get exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002640 if(ret != 0)
2641 {
q.huang934ec0e2025-07-22 19:56:59 +08002642 LOGE(GSW_NW,"mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002643 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002644 }
2645
2646 update_fplmn_list(fplmn);
2647 for(int i = 0; i < fplmn_index; i++)
2648 {
2649 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2650 {
2651 continue;
2652 }
2653 extract_mcc_mnc(fplmn_array[i], plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);
q.huang934ec0e2025-07-22 19:56:59 +08002654 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 +08002655 plmn_list->plmn_list_len++;
2656 }
2657
q.huang934ec0e2025-07-22 19:56:59 +08002658 LOGE(GSW_NW,"fplmn = %s\n", fplmn);
b.liu68a94c92025-05-24 12:53:41 +08002659 return GSW_HAL_SUCCESS;
2660}
2661
2662/*
2663 * @brief add PLMNs from the plmn_list to the FPLMN list
2664 * @param [in] plmn_list:
2665 * @retval 0: success
2666 * @retval other: fail
2667 */
2668int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2669{
2670
2671 if (nw_init_flag == 0 || nw_info_handle == NULL)
2672 {
xy.heb41615b2025-05-28 16:33:20 +08002673 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002674 }
2675
2676 if(plmn_list->plmn_list_len >= fplmn_max_length)
2677 {
q.huang934ec0e2025-07-22 19:56:59 +08002678 LOGE(GSW_NW,"can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002679 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002680 }
2681
2682 int i = 0;
2683 int index = -1;
2684
2685 for(i = 0; i < plmn_list->plmn_list_len; i++)
2686 {
2687 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2688
2689 if(index == -1)
2690 {
q.huang934ec0e2025-07-22 19:56:59 +08002691 LOGE(GSW_NW,"no this PLMN, add it\n");
b.liu68a94c92025-05-24 12:53:41 +08002692 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2693 {
q.huang934ec0e2025-07-22 19:56:59 +08002694 LOGE(GSW_NW,"can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002695 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002696 }
2697
2698 else
2699 {
2700 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2701 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2702 fplmn_array[fplmn_index][5] = '\0';
q.huang934ec0e2025-07-22 19:56:59 +08002703 LOGE(GSW_NW,"fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
b.liu68a94c92025-05-24 12:53:41 +08002704 fplmn_index++;
2705 }
2706 }
2707
2708 else
2709 {
q.huang934ec0e2025-07-22 19:56:59 +08002710 LOGE(GSW_NW,"already have this PLMN, don't add it\n");
b.liu68a94c92025-05-24 12:53:41 +08002711 }
2712 }
2713
2714 char fplmn_str[256] = {0};
2715 convert_plmn_to_fplmn_str(fplmn_str);
2716
q.huang934ec0e2025-07-22 19:56:59 +08002717 LOGE(GSW_NW,"fplmn_str = %s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002718
2719 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2720 if(ret != 0)
2721 {
q.huang934ec0e2025-07-22 19:56:59 +08002722 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002723 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002724 }
2725
q.huang934ec0e2025-07-22 19:56:59 +08002726 LOGE(GSW_NW,"gsw_add_forbidden_networks exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002727 return GSW_HAL_SUCCESS;
2728}
2729
2730/*
2731 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2732 * @param [in] plmn_list:
2733 * @retval 0: success
2734 * @retval other: fail
2735 */
2736int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2737{
b.liu68a94c92025-05-24 12:53:41 +08002738 if (nw_init_flag == 0 || nw_info_handle == NULL)
2739 {
q.huangfa0a0a32025-06-12 17:07:23 +08002740 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002741 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002742 }
2743
2744 int i = 0;
2745 int index = -1;
2746
2747 for(i = 0; i < plmn_list->plmn_list_len; i++)
2748 {
2749 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2750 if(index != -1)
2751 {
2752 remove_fplmn(index);
2753 }
2754 else
2755 {
q.huang934ec0e2025-07-22 19:56:59 +08002756 LOGE(GSW_NW,"no this PLMN, can't remove it\n");
b.liu68a94c92025-05-24 12:53:41 +08002757 }
2758 }
2759
2760 for(i = 0; i < fplmn_index; i++)
2761 {
q.huang934ec0e2025-07-22 19:56:59 +08002762 LOGE(GSW_NW,"fplmn_array[%d] = %s\n", i, fplmn_array[i]);
b.liu68a94c92025-05-24 12:53:41 +08002763 }
2764
2765 char fplmn_str[256] = {0};
2766 convert_plmn_to_fplmn_str(fplmn_str);
q.huang934ec0e2025-07-22 19:56:59 +08002767 LOGE(GSW_NW,"fplmn_str = %s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002768
2769 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2770 if(ret != 0)
2771 {
q.huang934ec0e2025-07-22 19:56:59 +08002772 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002773 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002774 }
2775
q.huang934ec0e2025-07-22 19:56:59 +08002776 LOGE(GSW_NW,"gsw_remove_forbidden_networks exit\n");
b.liu68a94c92025-05-24 12:53:41 +08002777 return GSW_HAL_SUCCESS;
2778}
2779
2780/*
2781 * @brief clear FPLMN list
2782 * @param
2783 * @retval 0: success
2784 * @retval other: fail
2785 */
2786int gsw_clear_forbidden_networks(void)
2787{
2788 if (nw_init_flag == 0 || nw_info_handle == NULL)
2789 {
xy.heb41615b2025-05-28 16:33:20 +08002790 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002791 }
2792
2793 char fplmn_str[FPLMN_STRING_LENGTH+1];
2794 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2795 fplmn_str[(6 * fplmn_max_length)] = '\0';
2796
q.huang934ec0e2025-07-22 19:56:59 +08002797 LOGE(GSW_NW,"%s\n", fplmn_str);
b.liu68a94c92025-05-24 12:53:41 +08002798 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2799 if(ret != 0)
2800 {
q.huang934ec0e2025-07-22 19:56:59 +08002801 LOGE(GSW_NW,"mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002802 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002803 }
2804
2805 return GSW_HAL_SUCCESS;
2806}
2807
2808/*
2809 * @brief get oos config
2810 * @param [in] oos_config
2811 * @retval 0: success
2812 * @retval other: fail
2813 */
2814int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2815{
2816 if (nw_init_flag == 0 || nw_info_handle == NULL)
2817 {
xy.heb41615b2025-05-28 16:33:20 +08002818 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002819 }
2820
2821 if(pt_info == NULL)
2822 {
q.huang934ec0e2025-07-22 19:56:59 +08002823 LOGE(GSW_NW,"pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002824 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002825 }
2826
2827 int ret = -1;
2828
2829 mbtk_oos_info oos_info;
2830 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2831
2832 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2833 if(ret != 0)
2834 {
q.huang934ec0e2025-07-22 19:56:59 +08002835 LOGE(GSW_NW,"mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002836 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002837 }
2838
2839 if(oos_info.mode == 0)
2840 {
2841 pt_info->t_min = 0;
2842 pt_info->t_step = 0;
2843 pt_info->t_max = 0;
2844 }
2845
2846 else
2847 {
2848 pt_info->t_min = (int)oos_info.oosPhase[0];
2849 pt_info->t_step = (int)oos_info.oosPhase[1];
2850 pt_info->t_max = (int)oos_info.oosPhase[2];
2851 }
2852
2853 return GSW_HAL_SUCCESS;
2854}
2855
2856
2857/*
2858 * @brief set oos config
2859 * @param [in] oos_config
2860 * @retval 0: success
2861 * @retval other: fail
2862 */
2863int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2864{
2865 if (nw_init_flag == 0 || nw_info_handle == NULL)
2866 {
xy.heb41615b2025-05-28 16:33:20 +08002867 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002868 }
2869
2870 if(pt_info == NULL)
2871 {
q.huang934ec0e2025-07-22 19:56:59 +08002872 LOGE(GSW_NW,"pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002873 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002874 }
2875
2876 int ret = -1;
2877 mbtk_oos_info oos_info;
2878 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2879
2880 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2881 {
q.huang934ec0e2025-07-22 19:56:59 +08002882 LOGE(GSW_NW,"gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002883 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002884 }
2885 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2886 {
2887 oos_info.mode = 1;
2888 oos_info.oosPhase[0] = pt_info->t_min;
2889 }
2890 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && pt_info->t_max == 0)
2891 {
2892 oos_info.mode = 1;
2893 oos_info.oosPhase[0] = pt_info->t_min;
2894 oos_info.oosPhase[1] = pt_info->t_step;
2895 }
2896 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && (pt_info->t_max > 0 && pt_info->t_max <= 255))
2897 {
2898 oos_info.mode = 1;
2899 oos_info.oosPhase[0] = pt_info->t_min;
2900 oos_info.oosPhase[1] = pt_info->t_step;
2901 oos_info.oosPhase[2] = pt_info->t_max;
2902 }
2903 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2904 {
2905 oos_info.mode = 0;
2906 }
2907 else
2908 {
q.huang934ec0e2025-07-22 19:56:59 +08002909 LOGE(GSW_NW,"gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002910 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002911 }
2912
2913 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2914 if(ret != 0)
2915 {
q.huang934ec0e2025-07-22 19:56:59 +08002916 LOGE(GSW_NW,"mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002917 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002918 }
2919
2920 return GSW_HAL_SUCCESS;
2921}
2922
q.huang238b22a2025-06-10 14:36:59 +08002923/**
2924 * @brief get imei function
2925 * @param [in] len imei length,max is 20
2926 * @param [out] imei return imei from this func
2927 * @retval 0: success
2928 * @retval other: fail
2929 */
2930int gsw_get_imei(int len, char *imei)
2931{
q.huang238b22a2025-06-10 14:36:59 +08002932 if (nw_init_flag == 0 || nw_info_handle == NULL)
2933 {
2934 printf("nw sdk has been deinit\n");
2935 return GSW_HAL_NORMAL_FAIL;
2936 }
2937
2938 if(imei == NULL)
2939 {
q.huang934ec0e2025-07-22 19:56:59 +08002940 LOGE(GSW_NW,"imei is NULL.");
q.huang238b22a2025-06-10 14:36:59 +08002941 return GSW_HAL_ARG_INVALID;
2942 }
2943
2944 if(len < GSW_IMEI_LENGTH)
2945 {
q.huang934ec0e2025-07-22 19:56:59 +08002946 LOGE(GSW_NW,"imei len is too short,len = %d\n", len);
q.huang238b22a2025-06-10 14:36:59 +08002947 return GSW_HAL_NORMAL_FAIL;
2948 }
2949
q.huang861c07d2025-06-24 16:54:58 +08002950 int ret = mbtk_imei_get(nw_info_handle, (void *)imei);
q.huang238b22a2025-06-10 14:36:59 +08002951 if(ret != MBTK_ERR_OK)
2952 {
q.huang934ec0e2025-07-22 19:56:59 +08002953 LOGE(GSW_NW,"[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002954 return GSW_HAL_NORMAL_FAIL;
2955 }
2956
2957 return GSW_HAL_SUCCESS;
2958}
2959
2960/**
2961 * @brief reset modem stack only, notice: after use this method, all ril sdk
2962 * need restart by app, means network, sim, sms, data need deinit then init!
2963 * @param
2964 * @retval 0: success
2965 * @retval other: fail
2966 */
2967int gsw_reset_modem(void)
2968{
2969 int ret = -1;
2970 if (nw_init_flag == 0 || nw_info_handle == NULL)
2971 {
2972 printf("nw sdk has been deinit\n");
2973 return GSW_HAL_NORMAL_FAIL;
2974 }
2975 mbtk_modem_info_t info;
2976 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2977 info.rst = 0;
2978
2979 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2980 if(ret)
2981 {
q.huang934ec0e2025-07-22 19:56:59 +08002982 LOGE(GSW_NW,"[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002983 return GSW_HAL_NORMAL_FAIL;
2984 }
2985
2986 sleep(1);
2987
2988 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2989 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2990 if(ret)
2991 {
q.huang934ec0e2025-07-22 19:56:59 +08002992 LOGE(GSW_NW,"[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
q.huang238b22a2025-06-10 14:36:59 +08002993 return GSW_HAL_NORMAL_FAIL;
2994 }
2995 return GSW_HAL_SUCCESS;
2996}
b.liu68a94c92025-05-24 12:53:41 +08002997
q.huangc8b93122025-06-17 17:46:05 +08002998int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2999{
3000 if (nw_init_flag == 0 || nw_info_handle == NULL)
3001 {
3002 return GSW_HAL_NORMAL_FAIL;
3003 }
q.huang934ec0e2025-07-22 19:56:59 +08003004
3005 void* cb_func;
q.huangc8b93122025-06-17 17:46:05 +08003006 if(handle_ptr == NULL)
3007 {
q.huang934ec0e2025-07-22 19:56:59 +08003008 LOGE(GSW_NW,"reg airplane mode cb is NULL");
3009 cb_func=NULL;
q.huangc8b93122025-06-17 17:46:05 +08003010 }
q.huang934ec0e2025-07-22 19:56:59 +08003011 else
3012 {
3013 cb_func=(void*) gsw_operating_mode_event_callback;
q.huangc8b93122025-06-17 17:46:05 +08003014 }
q.huangc8b93122025-06-17 17:46:05 +08003015
q.huang934ec0e2025-07-22 19:56:59 +08003016 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle, cb_func);
3017
3018 if (ret != 0)
3019 {
3020 LOGE(GSW_NW,"mbtk_radio_state_change_cb_reg fail, ret is %d",ret);
3021 return GSW_HAL_NORMAL_FAIL;
3022 }
3023
3024 airplane_cb = handle_ptr;
3025
3026 if(airplane_cb !=NULL)
3027 {
3028 int opmode;
3029 ret = gsw_get_opmode(&opmode);
3030 if(ret == 0)
3031 {
3032 airplane_cb(opmode);
3033 }
3034 else
3035 {
3036 LOGE(GSW_NW,"gsw_get_opmode fail, ret is%d", ret);
3037 }
3038 }
3039
3040 return GSW_HAL_SUCCESS;
q.huangc8b93122025-06-17 17:46:05 +08003041}
3042
hong.liud2417072025-06-27 07:10:37 -07003043int gsw_get_apn_reserved_id(const char *apn)
3044{
3045 return 0;
3046}
3047
3048int gsw_set_apn_reserved_id(int reserved_id, const char *apn)
3049{
3050 return 0;
3051}
3052
3053int gsw_data_call_clear_session(int linkid, Link_Info_s *LinkInf)
3054{
3055 return 0;
3056}
3057
3058void *gsw_onUnsolicited(void *arg)
3059{
3060 return 0;
3061}
3062
3063int gsw_sdk_init(void)
3064{
3065 return 0;
3066}
3067
3068int gsw_get_modem_state_exp(void)
3069{
3070 return 0;
3071}