blob: b9d6147048efb615e0912d86f4e1c509d8f62a6d [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include <stdlib.h>
2#include <stdio.h>
3#include <string.h>
4#include <sys/stat.h>
5#include <sys/types.h>
6#include <unistd.h>
7#include <dlfcn.h>
8#include <stdint.h>
9
10#include <errno.h>
11#include <stdbool.h>
12#include <pthread.h>
13
l.yang2678d6f2025-05-28 03:58:49 -070014#include "gsw_eu_ecall_interface.h"
b.liu68a94c92025-05-24 12:53:41 +080015
16#define RIL_MAX_NUMBER_LEN 40
17#define MBTK_ECALL_MSD_LEN_MAX 600
18
19#ifndef LOG_ERR_LEVEL
20#define LOG_ERR_LEVEL 3 /* error conditions */
21#endif
22#ifndef LOG_WARN_LEVEL
23#define LOG_WARN_LEVEL 4 /* warning conditions */
24#endif
25#ifndef LOG_INFO_LEVEL
26#define LOG_INFO_LEVEL 6 /* informational */
27#endif
28#ifndef LOG_DEBUG_LEVEL
29#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
30#endif
31#ifndef LOG_VERBOSE_LEVEL
32#define LOG_VERBOSE_LEVEL 8
33#endif
34
l.yang6a42e4d2025-05-28 01:04:20 -070035#define GSW_ECALL "[HAL][GSW_ECALL]"
36
b.liu68a94c92025-05-24 12:53:41 +080037#define LOGV(fmt, args ...) \
38 do{ \
39 char *file_ptr_1001 = __FILE__; \
40 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
41 char line_1001[10] = {0}; \
42 sprintf(line_1001, "%d", __LINE__); \
43 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
44 if(*ptr_1001 == '/') \
45 break; \
46 ptr_1001--; \
47 } \
l.yang6a42e4d2025-05-28 01:04:20 -070048 fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_ECALL"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080049 } while(0)
50
51#define LOGI(fmt, args...) \
52 do{ \
53 char *file_ptr_1001 = __FILE__; \
54 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
55 char line_1001[10] = {0}; \
56 sprintf(line_1001, "%d", __LINE__); \
57 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
58 if(*ptr_1001 == '/') \
59 break; \
60 ptr_1001--; \
61 } \
l.yang6a42e4d2025-05-28 01:04:20 -070062 fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: "GSW_ECALL"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080063 } while(0)
64
65#define LOGD(fmt, args...) \
66 do{ \
67 char *file_ptr_1001 = __FILE__; \
68 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
69 char line_1001[10] = {0}; \
70 sprintf(line_1001, "%d", __LINE__); \
71 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
72 if(*ptr_1001 == '/') \
73 break; \
74 ptr_1001--; \
75 } \
l.yang6a42e4d2025-05-28 01:04:20 -070076 fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_ECALL"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080077 } while(0)
78
79#define LOGW(fmt, args...) \
80 do{ \
81 char *file_ptr_1001 = __FILE__; \
82 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
83 char line_1001[10] = {0}; \
84 sprintf(line_1001, "%d", __LINE__); \
85 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
86 if(*ptr_1001 == '/') \
87 break; \
88 ptr_1001--; \
89 } \
l.yang6a42e4d2025-05-28 01:04:20 -070090 fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: "GSW_ECALL"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080091 } while(0)
92
93#define LOGE(fmt, args...) \
94 do{ \
95 char *file_ptr_1001 = __FILE__; \
96 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
97 char line_1001[10] = {0}; \
98 sprintf(line_1001, "%d", __LINE__); \
99 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
100 if(*ptr_1001 == '/') \
101 break; \
102 ptr_1001--; \
103 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700104 fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: "GSW_ECALL"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800105 } while(0)
106
107typedef void (*mbtk_log)(int level, const char *format,...);
108
109
110typedef unsigned int uint32;
111typedef unsigned char uint8;
112typedef unsigned short uint16;
113
114typedef enum {
115 MBTK_ECALL_URC_ID_ALACK = 0, // AL-ACK signal received (refer to : urc_data)
116 MBTK_ECALL_URC_ID_SYNC_LOST, // eIM lost synchronization with PSAP
117 // (A resynch occurs after the synchronization is lost.)
118 MBTK_ECALL_URC_ID_NACK, // NACK signal received
119 MBTK_ECALL_URC_ID_RESERVED_3,
120 MBTK_ECALL_URC_ID_RESERVED_4,
121 MBTK_ECALL_URC_ID_RESERVED_5, // 5
122 MBTK_ECALL_URC_ID_3GPP_FATAL, // eIM is terminated: fatal error (3GPP Abort function)
123 MBTK_ECALL_URC_ID_CALL_DROP, // eIM is terminated: call drop
124 MBTK_ECALL_URC_ID_GENERIC, // Generic error
125 MBTK_ECALL_URC_ID_MSD_REQ, // PSAP request MSD (Only for PULL modem)
126 MBTK_ECALL_URC_ID_MSD_SEND_START, // 10 : eIM starts sending MSD
127 MBTK_ECALL_URC_ID_INITIATION, // The eIM starts sending the Initiation signal (Only for PUSH modem).
128 // It also indicates that the call setup is completed.
129 MBTK_ECALL_URC_ID_SEND_MSD, // PUSH: SEND_MSD -> MSD_SEND_START
130 // PULL: SEND_MSD -> MSD_REQ -> MSD_SEND_START
131 MBTK_ECALL_URC_ID_SEND_MSD_FULL,// SEND MSD signal received too often, PSAP sync failure assumed
132 MBTK_ECALL_URC_ID_SYNCED_PSAP, // IVS eIM is synced with PSAP
133 MBTK_ECALL_URC_ID_SYNCED_PSAP_EIM, // 15: IVS eIM is synced with PSAP eIM
134 MBTK_ECALL_URC_ID_LLACK, // Link layer ACK received
135 MBTK_ECALL_URC_ID_HLACK, // Higher Layer ACK received (similar to AL-ACK (#0) but without data)
136 MBTK_ECALL_URC_ID_EIM_RESET, // The eIM transmitter idles after a full reset. The eIM transmitter is reset after sync loss
137 // (for example, because of the end of PSAP transmission).
138 MBTK_ECALL_URC_ID_EIM_IDLES, // The eIM transmitter idles after the transmission of the Initiation signal (push mode)
139 MBTK_ECALL_URC_ID_MSD_UPDATE, // 20 : MSD update request is received.
140 MBTK_ECALL_URC_ID_MSD_UPDATE_DONE, // MSD update is done.
141 MBTK_ECALL_URC_ID_MSD_UPDATE_ERR, // MSD update request cannot be processed.
142 MBTK_ECALL_URC_ID_T3_EXPIRED, // T3 expired
143 MBTK_ECALL_URC_ID_T5_EXPIRED, // T5 expired
144 MBTK_ECALL_URC_ID_T6_EXPIRED, // 25 : T6 expired
145 MBTK_ECALL_URC_ID_T7_EXPIRED, // T7 expired
146 MBTK_ECALL_URC_ID_TH_EXPIRED, // TH expired
147 MBTK_ECALL_URC_ID_RESERVED_28,
148 MBTK_ECALL_URC_ID_RESERVED_29,
149 MBTK_ECALL_URC_ID_RESERVED_30, // 30
150 MBTK_ECALL_URC_ID_IVS_EVENT_TIMEOUT,
151 MBTK_ECALL_URC_ID_PSAP_REQ, // Only for ERA
152 MBTK_ECALL_URC_ID_MSD_SEND_FAIL_FOR_NG // NG-eCall fail to transfer MSD
153} mbtk_ecall_urc_id_enum;
154
155typedef enum {
156 MBTK_CLCC = 1,
157 MBTK_CPAS,
158 MBTK_DISCONNECTED,
159} mbtk_call_enum;
160
161typedef enum {
162 MBTK_CALL_RADY, //MT allows commands from TA/TE
163 MBTK_CALL_UNAVAILABLE, //MT does not allow commands from TA/TE
164 MBTK_CALL_UNKNOWN, //MT is not guaranteed to respond to instructions
165 MBTK_CALL_RINGING, //MT is ready for commands from TA/TE, but the ringer is active
166 MBTK_CALL_PROGRESS, //MT is ready for commands from TA/TE, but a call is in progress
167 MBTK_CALL_ASLEEP, //MT is unable to process commands from TA/TE because it is in a low functionality state
168 MBTK_CALL_ACTIVE,
169} mbtk_call_pas_enum;
170
171#define MBTK_ECALL_CFG_T3 (1 << MBTK_ECALL_CFG_ITEM_T3) // ms
172#define MBTK_ECALL_CFG_T5 (1 << MBTK_ECALL_CFG_ITEM_T5) // ms
173#define MBTK_ECALL_CFG_T6 (1 << MBTK_ECALL_CFG_ITEM_T6) // ms
174#define MBTK_ECALL_CFG_T7 (1 << MBTK_ECALL_CFG_ITEM_T7) // ms
175#define MBTK_ECALL_CFG_TH (1 << MBTK_ECALL_CFG_ITEM_TH) // ms
176#define MBTK_ECALL_CFG_TIMER_CALLBACK (1 << MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK) // T9
177#define MBTK_ECALL_CFG_TIMER_CLEARDOWN (1 << MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN) // T2
178#define MBTK_ECALL_CFG_TIMER_DEREG (1 << MBTK_ECALL_CFG_ITEM_TIMER_DEREG) // T10
179#define MBTK_ECALL_CFG_TIMER_DIAL (1 << MBTK_ECALL_CFG_ITEM_TIMER_DIAL) // "dial"
180#define MBTK_ECALL_CFG_TIMER_REDIAL (1 << MBTK_ECALL_CFG_ITEM_TIMER_REDIAL) // "redialtmr"
181#define MBTK_ECALL_CFG_TIMER_SMS (1 << MBTK_ECALL_CFG_ITEM_TIMER_SMS) // "sms" // 10
182#define MBTK_ECALL_CFG_REDIALCNT (1 << MBTK_ECALL_CFG_ITEM_REDIALCNT) // "redialcnt"
183#define MBTK_ECALL_CFG_SMSPROCESS (1 << MBTK_ECALL_CFG_ITEM_SMSPROCESS) // "smsprocess"
184#define MBTK_ECALL_CFG_SMSMSDCNT (1 << MBTK_ECALL_CFG_ITEM_SMSMSDCNT) // "smsmsdcnt"
185
186
187typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
188
189typedef struct
190{
191 int client_fd;
192 pthread_t read_thread_id;
193 int exit_fd[2];
194 bool is_waitting;
195 pthread_cond_t cond;
196 pthread_mutex_t mutex;
197
198 pthread_mutex_t send_mutex;
199
200 // Temp response data.
201 uint16 info_err;
202 uint16 data_len;
203 void *data;
204
205 //mbtk wyq for server_ready_status add start
206 char server_ready_status;
207 //mbtk wyq for server_ready_status add end
208
209 mbtk_info_callback_func net_state_cb;
210 mbtk_info_callback_func call_state_cb;
211 mbtk_info_callback_func sms_state_cb;
212 mbtk_info_callback_func radio_state_cb;
213 mbtk_info_callback_func sim_state_cb;
214 mbtk_info_callback_func pdp_state_cb;
215 //add signal by xr
216 mbtk_info_callback_func signal_state_cb;
217} mbtk_info_handle_t;
218
219typedef enum {
220 MBTK_ECALL_CFG_ITEM_T3 = 0, // ms
221 MBTK_ECALL_CFG_ITEM_T5, // ms
222 MBTK_ECALL_CFG_ITEM_T6, // ms
223 MBTK_ECALL_CFG_ITEM_T7, // ms
224 MBTK_ECALL_CFG_ITEM_TH, // ms
225 MBTK_ECALL_CFG_ITEM_TIMER_CALLBACK, // T9 // 5
226 MBTK_ECALL_CFG_ITEM_TIMER_CLEARDOWN, // T2
227 MBTK_ECALL_CFG_ITEM_TIMER_DEREG, // T10
228 MBTK_ECALL_CFG_ITEM_TIMER_DIAL, // "dial"
229 MBTK_ECALL_CFG_ITEM_TIMER_REDIAL, // "redialtmr"
230 MBTK_ECALL_CFG_ITEM_TIMER_SMS, // "sms" // 10
231 MBTK_ECALL_CFG_ITEM_REDIALCNT, // "redialcnt"
232 MBTK_ECALL_CFG_ITEM_SMSPROCESS, // "smsprocess"
233 MBTK_ECALL_CFG_ITEM_SMSMSDCNT, // "smsmsdcnt"
234
235 MBTK_ECALL_CFG_ITEM_MAX
236} mbtk_ecall_cfg_item_enum;
237
238
239typedef enum {
240 MBTK_ECALL_MSD_ITEM_VERSION = 0,
241 MBTK_ECALL_MSD_ITEM_MSG_ID,
242 MBTK_ECALL_MSD_ITEM_CONTROLTYPE,
243 MBTK_ECALL_MSD_ITEM_VIN,
244 MBTK_ECALL_MSD_ITEM_STORAGETYPE,
245 MBTK_ECALL_MSD_ITEM_TIMESTAMP,
246 MBTK_ECALL_MSD_ITEM_LOCATION,
247 MBTK_ECALL_MSD_ITEM_DIRECTION,
248 MBTK_ECALL_MSD_ITEM_LOCATIONN1,
249 MBTK_ECALL_MSD_ITEM_LOCATIONN2,
250 MBTK_ECALL_MSD_ITEM_NUMBEROFOCCUPANTS,
251 MBTK_ECALL_MSD_ITEM_ADDITIONALDATA,
252 MBTK_ECALL_MSD_ITEM_ALL_IN_ONE,
253 MBTK_ECALL_MSD_ITEM_ASI,
254 MBTK_ECALL_MSD_ITEM_VEHICLE_DIAGNOSTIC,
255 MBTK_ECALL_MSD_ITEM_CRASH_INFO,
256 MBTK_ECALL_MSD_ITEM_GNSS_TYPE
257} mbtk_ecall_msd_item_enum;
258
259typedef enum {
260 MBTK_ECALL_ONLY_TYPE_DISABLE = 0,
261 MBTK_ECALL_ONLY_TYPE_ENABLE_ECALL,
262 MBTK_ECALL_ONLY_TYPE_ENABLE_NG_ECALL,
263 MBTK_ECALL_ONLY_TYPE_ENABLE_ALL,
264 MBTK_ECALL_ONLY_TYPE_CONF_NUM,
265 MBTK_ECALL_ONLY_TYPE_NORMAL
266} mbtk_ecall_only_type_enum;
267
268typedef struct
269{
270 mbtk_ecall_msd_item_enum item_type;
271
272 uint8 data[64];
273} mbtk_ecall_msd_cfg_info_t;
274
275typedef enum {
276 MBTK_ECALL_SIM_TYPE_NO_SUPPORT = 0,
277 MBTK_ECALL_SIM_TYPE_SUPPORT_ECALL,
278 MBTK_ECALL_SIM_TYPE_SUPPORT_ECALL_ONLY
279} mbtk_ecall_sim_type_enum;
280
281
282typedef struct {
283 mbtk_ecall_only_type_enum active : 8;
284 mbtk_ecall_sim_type_enum sim_type : 8; // Only for GET.
285 uint8 test_num[RIL_MAX_NUMBER_LEN];
286 uint8 reconfig_num[RIL_MAX_NUMBER_LEN];
287} mbtk_ecall_only_info_t;
288
289typedef enum {
290 MBTK_ECALL_MODE_TYPE_EU = 0,
291 MBTK_ECALL_MODE_TYPE_ERA
292} mbtk_ecall_mode_type_enum;
293
294
295typedef enum {
296 MBTK_ECALL_DIAL_TYPE_TEST = 0,
297 MBTK_ECALL_DIAL_TYPE_RECONFIG,
298 MBTK_ECALL_DIAL_TYPE_MANUALLY,
299 MBTK_ECALL_DIAL_TYPE_AUTO,
300 MBTK_ECALL_DIAL_TYPE_NOT_ACTIVATED,
301 MBTK_ECALL_DIAL_TYPE_RELEASE
302} mbtk_ecall_dial_type_enum;
303
304typedef struct {
305 uint32 type; // mbtk_ecall_cfg_item_enum
306
307#if 0
308 uint32 timer_t3; // ms
309 uint32 timer_t5; // ms
310 uint32 timer_t6; // ms
311 uint32 timer_t7; // ms
312 uint32 timer_th; // ms
313
314 uint32 timer_callback; // s (T9)
315 uint32 timer_cleardown; // s (T2)
316 uint32 timer_dereg; // s (T10)
317 uint32 timer_dial; // s
318 uint32 timer_redialtmr; // s
319 uint32 timer_sms; // s
320
321 uint32 redialcnt;
322 uint32 smsprocess;
323 uint32 smsmsdcnt;
324#else
325 uint8 data_valid[MBTK_ECALL_CFG_ITEM_MAX];
326 uint32 data[MBTK_ECALL_CFG_ITEM_MAX];
327#endif
328} mbtk_ecall_cfg_info_t;
329
330
331typedef struct
332{
333 uint8 urc_id;
334 uint8 urc_data[5];
335} mbtk_ril_ecall_state_info_t;
336
337
338typedef mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
339static mbtk_info_handle_get mbtk_info_handle_get_ptr = NULL;
340
341typedef int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
342static mbtk_info_handle_free mbtk_info_handle_free_ptr = NULL;
343
344static gsw_eu_ecall_status_cb_f gsw_eu_ecall_status_cb;
345
346static pthread_t gsw_ecall_status_cb_thread;
347static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
348static pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;
349static bool g_thread_running = false;
350
351static uint32_t g_sta_cb_id = 0;
352static gsw_eu_ecall_msd_trans_status_e g_msd_send_status = 0;
353
354#define LIB_PATH "/lib/libmbtk_lib.so"
355
356
357
358
359
360
361typedef int (*mbtk_ecall_msd_set)(mbtk_info_handle_t* handle, const void* msd);
362static mbtk_ecall_msd_set mbtk_ecall_msd_set_ptr = NULL;
363
364typedef int (*mbtk_ecall_push)(mbtk_info_handle_t* handle);
365static mbtk_ecall_push mbtk_ecall_push_ptr = NULL;
366
367typedef int (*mbtk_ecall_only_set)(mbtk_info_handle_t* handle, const mbtk_ecall_only_info_t* info);
368static mbtk_ecall_only_set mbtk_ecall_only_set_ptr = NULL;
369
370
371typedef int (*mbtk_ecall_reg_set)(mbtk_info_handle_t* handle, int reg);
372static mbtk_ecall_reg_set mbtk_ecall_reg_set_ptr = NULL;
373
374typedef int (*mbtk_ecall_dial_start)(mbtk_info_handle_t* handle, mbtk_ecall_dial_type_enum type);
375static mbtk_ecall_dial_start mbtk_ecall_dial_start_ptr = NULL;
376
377typedef int (*mbtk_ecall_mode_set)(mbtk_info_handle_t* handle, mbtk_ecall_mode_type_enum mode);
378static mbtk_ecall_mode_set mbtk_ecall_mode_set_ptr = NULL;
379
380
381typedef int (*mbtk_ecall_cfg_set)(mbtk_info_handle_t* handle, const mbtk_ecall_cfg_info_t *cfg);
382static mbtk_ecall_cfg_set mbtk_ecall_cfg_set_ptr = NULL;
383
384typedef int (*mbtk_ecall_cfg_get)(mbtk_info_handle_t* handle, mbtk_ecall_cfg_info_t* cfg);
385static mbtk_ecall_cfg_get mbtk_ecall_cfg_get_ptr = NULL;
386
387typedef int (*mbtk_ecall_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
388static mbtk_ecall_state_change_cb_reg mbtk_ecall_state_change_cb_reg_ptr = NULL;
389
390typedef int (*mbtk_call_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
391static mbtk_call_state_change_cb_reg mbtk_call_state_change_cb_reg_ptr = NULL;
392
393
394
395static int state_t = -1;
396
397
398
399typedef struct
400{
401 uint8 call_wait;
402 uint8 dir1;
403 uint8 dir;
404 uint8 state;
405 uint8 mode;
406 uint8 mpty;
407 char phone_number[100];
408 uint8 type;
409 uint8 pas;
410 uint8 disconnected_id;
411 uint8 end_reason[128];
412} __attribute__((packed)) mbtk_call_info_t;
413
414
415//static mbtk_info_handle_t* ecall_info_handle = NULL;
416
417
418typedef void (*mbtk_log_init)(char *path, char *tag);
419static mbtk_log_init mbtk_log_init_ptr = NULL;
420
421static void *handle = NULL;
422typedef void (*mbtk_log)(int level, const char *format,...);
423static mbtk_log fun_ptr_log = NULL;
424static int ecall_init_flag = 0;
425static mbtk_info_handle_t* ecall_info_handle = NULL;
426
427
428
429static uint8_t fail_redial = 1;
430
431static gsw_eu_ecall_event_cb_f gsw_eu_ecall_event_cb = NULL;
432static bool g_setevent_cb = false;
433
434static void mbtk_send_singnal()
435{
436 pthread_mutex_lock(&g_mutex);
437 pthread_cond_signal(&g_cond);
438 pthread_mutex_unlock(&g_mutex);
439
440}
441
442static void mbtk_wait_signal()
443{
444
445 pthread_mutex_lock(&g_mutex);
446 pthread_cond_wait(&g_cond, &g_mutex);
447 pthread_mutex_unlock(&g_mutex);
448}
449
450static void mbtk_ecall_api_ptr_deinit()
451{
452 dlclose(handle);
453 handle = NULL;
454 mbtk_log_init_ptr = NULL;
455 mbtk_info_handle_get_ptr=NULL;
456 mbtk_info_handle_free_ptr=NULL;
457 mbtk_ecall_msd_set_ptr=NULL;
458 mbtk_ecall_push_ptr=NULL;
459 mbtk_ecall_only_set_ptr=NULL;
460 mbtk_ecall_reg_set_ptr=NULL;
461 mbtk_ecall_dial_start_ptr=NULL;
462 mbtk_ecall_mode_set_ptr=NULL;
463 mbtk_ecall_cfg_set_ptr=NULL;
464 mbtk_ecall_cfg_get_ptr=NULL;
465 mbtk_ecall_state_change_cb_reg_ptr=NULL;
466 gsw_eu_ecall_status_cb=NULL;
467 gsw_eu_ecall_event_cb=NULL;
468 g_setevent_cb=false;
469 mbtk_ecall_only_set_ptr = NULL;
470 fun_ptr_log=NULL;
471
472}
473
474
475static int mbtk_ecall_api_import()
476{
477 handle = dlopen(LIB_PATH, RTLD_NOW);
478 if (handle == NULL)
479 {
l.yang2678d6f2025-05-28 03:58:49 -0700480 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800481 }
482
483 if(fun_ptr_log == NULL)
484 {
485 fun_ptr_log = (mbtk_log)dlsym(handle, "mbtk_log");
486 if(fun_ptr_log == NULL)
487 {
l.yang2678d6f2025-05-28 03:58:49 -0700488 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800489 }
490 }
491
492 if(mbtk_log_init_ptr == NULL)
493 {
494 mbtk_log_init_ptr = (mbtk_log_init)dlsym(handle, "mbtk_log_init");
495 if(mbtk_log_init_ptr == NULL)
496 {
l.yang2678d6f2025-05-28 03:58:49 -0700497 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800498 }
499 }
500
501 if(mbtk_info_handle_get_ptr == NULL)
502 {
503 mbtk_info_handle_get_ptr = (mbtk_info_handle_get)dlsym(handle, "mbtk_info_handle_get");
504 if(mbtk_info_handle_get_ptr == NULL)
505 {
l.yang2678d6f2025-05-28 03:58:49 -0700506 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800507 }
508 }
509
510 if(mbtk_info_handle_free_ptr == NULL)
511 {
512 mbtk_info_handle_free_ptr = (mbtk_info_handle_free)dlsym(handle, "mbtk_info_handle_free");
513 if(mbtk_info_handle_free_ptr == NULL)
514 {
l.yang2678d6f2025-05-28 03:58:49 -0700515 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800516 }
517 }
518
519
520
521 if(mbtk_ecall_msd_set_ptr == NULL)
522 {
523 mbtk_ecall_msd_set_ptr = (mbtk_ecall_msd_set)dlsym(handle, "mbtk_ecall_msd_set");
524 if(mbtk_ecall_msd_set_ptr == NULL)
525 {
l.yang2678d6f2025-05-28 03:58:49 -0700526 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800527 }
528 }
529
530 if(mbtk_ecall_push_ptr == NULL)
531 {
532 mbtk_ecall_push_ptr = (mbtk_ecall_push)dlsym(handle, "mbtk_ecall_push");
533 if(mbtk_ecall_push_ptr == NULL)
534 {
l.yang2678d6f2025-05-28 03:58:49 -0700535 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800536 }
537 }
538 if(mbtk_ecall_only_set_ptr == NULL)
539 {
540 mbtk_ecall_only_set_ptr = (mbtk_ecall_only_set)dlsym(handle, "mbtk_ecall_only_set");
541 if(mbtk_ecall_only_set_ptr == NULL)
542 {
l.yang2678d6f2025-05-28 03:58:49 -0700543 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800544 }
545 }
546
547 if(mbtk_ecall_reg_set_ptr == NULL)
548 {
549 mbtk_ecall_reg_set_ptr = (mbtk_ecall_reg_set)dlsym(handle, "mbtk_ecall_reg_set");
550 if(mbtk_ecall_reg_set_ptr == NULL)
551 {
l.yang2678d6f2025-05-28 03:58:49 -0700552 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800553 }
554 }
555 if(mbtk_ecall_dial_start_ptr == NULL)
556 {
557 mbtk_ecall_dial_start_ptr = (mbtk_ecall_dial_start)dlsym(handle, "mbtk_ecall_dial_start");
558 if(mbtk_ecall_dial_start_ptr == NULL)
559 {
l.yang2678d6f2025-05-28 03:58:49 -0700560 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800561 }
562 }
563
564 if(mbtk_ecall_mode_set_ptr == NULL)
565 {
566 mbtk_ecall_mode_set_ptr = (mbtk_ecall_mode_set)dlsym(handle, "mbtk_ecall_mode_set");
567 if(mbtk_ecall_mode_set_ptr == NULL)
568 {
l.yang2678d6f2025-05-28 03:58:49 -0700569 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800570 }
571 }
572
573 if(mbtk_ecall_cfg_set_ptr == NULL)
574 {
575 mbtk_ecall_cfg_set_ptr = (mbtk_ecall_cfg_set)dlsym(handle, "mbtk_ecall_cfg_set");
576 if(mbtk_ecall_cfg_set_ptr == NULL)
577 {
l.yang2678d6f2025-05-28 03:58:49 -0700578 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800579 }
580 }
581 if(mbtk_ecall_cfg_get_ptr == NULL)
582 {
583 mbtk_ecall_cfg_get_ptr = (mbtk_ecall_cfg_get)dlsym(handle, "mbtk_ecall_cfg_get");
584 if(mbtk_ecall_cfg_get_ptr == NULL)
585 {
l.yang2678d6f2025-05-28 03:58:49 -0700586 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800587 }
588 }
589 if(mbtk_ecall_state_change_cb_reg_ptr == NULL)
590 {
591 mbtk_ecall_state_change_cb_reg_ptr = (mbtk_ecall_state_change_cb_reg)dlsym(handle, "mbtk_ecall_state_change_cb_reg");
592 if(mbtk_ecall_state_change_cb_reg_ptr == NULL)
593 {
l.yang2678d6f2025-05-28 03:58:49 -0700594 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800595 }
596 }
597
598 if(mbtk_call_state_change_cb_reg_ptr == NULL)
599 {
600 mbtk_call_state_change_cb_reg_ptr = (mbtk_call_state_change_cb_reg)dlsym(handle, "mbtk_call_state_change_cb_reg");
601 if(mbtk_call_state_change_cb_reg_ptr == NULL)
602 {
l.yang2678d6f2025-05-28 03:58:49 -0700603 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800604 }
605 }
606
607 return GSW_HAL_SUCCESS;
608}
609
610
611static void gsw_call_state_change_cb(const void *data, int data_len)
612{
613 mbtk_call_info_t *reg = (mbtk_call_info_t *)data;
614 switch (reg->call_wait)
615 {
616 case MBTK_CLCC:
617 {
618 LOGD("RING : %d, %d, %d, %d, %d, %s, %d, %d", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type, reg->disconnected_id);
619 switch(reg->state)
620 {
621 case 0:
622 state_t = 0;
623 LOGD("reg->state = GSW_VOICE_CALL_CONNECTED ");
624 break;
625 case 1:
626 //state_t = GSW_VOICE_CALL_HOLDING;
627 LOGD("reg->state = GSW_VOICE_CALL_HOLDING ");
628 break;
629 case 2:
630 //state_t = GSW_VOICE_CALL_DIALING;
631 LOGD("reg->state = GSW_VOICE_CALL_DIALING ");
632 break;
633 case 3:
634 //state_t = GSW_VOICE_CALL_ALERTING;
635 LOGD("reg->state = GSW_VOICE_CALL_ALERTING ");
636 break;
637 case 4:
638 //state_t = GSW_VOICE_CALL_INCOMING;
639
640 LOGD("reg->state = GSW_VOICE_CALL_INCOMING ");
641 break;
642 case 5:
643 //state_t = GSW_VOICE_CALL_WAITING;
644 LOGD("reg->state = GSW_VOICE_CALL_WAITING ");
645 break;
646 case 6:
647 //state_t = GSW_VOICE_CALL_END;
648 LOGD("reg->state = GSW_VOICE_CALL_END ");
649 break;
650 }
651
652 g_sta_cb_id = reg->dir1;
653 }
654
655 break;
656 default:
657 LOGE("RING : None call_wait = %d", reg->call_wait);
658 break;
659 }
660}
661
662
663/**
664* @brief init the Europe Ecall voice
665* @param [in] None
666* @param [out] None
667* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
668*/
669
670int32_t gsw_eu_ecall_voice_init(void)
671{
672 int ret =-1;
673 ret = mbtk_ecall_api_import();
674 if(ret <0)
675 {
l.yang2678d6f2025-05-28 03:58:49 -0700676 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800677 }
678
679 mbtk_log_init_ptr("syslog", "GSW_ECALL");
680
681 ecall_info_handle = mbtk_info_handle_get_ptr();
682 if(ecall_info_handle == NULL)
683 {
684 LOGE("mbtk_info_handle_get_ptr fail!!!");
l.yang2678d6f2025-05-28 03:58:49 -0700685 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800686 }
687
688 if(ecall_init_flag == 0)
689 {
690 ecall_init_flag = 1;
691 }
692 ret = mbtk_call_state_change_cb_reg_ptr(ecall_info_handle, gsw_call_state_change_cb);
693 if(ret < 0)
694 {
695 LOGE("mbtk_call_state_change_cb_reg_ptr failed");
l.yang2678d6f2025-05-28 03:58:49 -0700696 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800697 }
698 return GSW_HAL_SUCCESS;
699
700}
701
702
703/**
704* @brief deinit the Europe Ecall voice
705* @param [in] None
706* @param [out] None
707* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
708*/
709int32_t gsw_eu_ecall_voice_deinit(void)
710{
711 int ret = -1;
712 if(ecall_info_handle == NULL || ecall_init_flag ==0)
713 {
714 LOGE("No init can not deinit");
l.yang2678d6f2025-05-28 03:58:49 -0700715 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800716 }
717
718 g_thread_running = false;
719 mbtk_send_singnal();
720 if (gsw_ecall_status_cb_thread != 0)
721 {
722 pthread_cancel(gsw_ecall_status_cb_thread);
723 pthread_join(gsw_ecall_status_cb_thread, NULL);
724 gsw_ecall_status_cb_thread = 0;
725 }
726
727 ret = mbtk_info_handle_free_ptr(&ecall_info_handle);
728 if(ret < 0 )
729 {
730 LOGE("mbtk_info_handle_free handle faile");
731 }
732 ecall_info_handle = NULL;
733 ecall_init_flag = 0;
734
735 mbtk_ecall_api_ptr_deinit();
736 return GSW_HAL_SUCCESS;
737
738}
739
740
741/**
742* @brief start a Europe Ecall
743* @param [in] gsw_eu_ecall_info_t *p_info: ecall info
744* @param [out] None
745* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
746*/
747int32_t gsw_eu_ecall_start(gsw_eu_ecall_info_t *p_info)
748{
749 int ret = -1;
750 mbtk_ecall_dial_type_enum ecall_type= -1;
751 mbtk_ecall_only_info_t only_info;
752
753
754 char tmp_number[GSW_EU_ECALL_MAX_PHONE_NUMBER] = {0};
755
756 char msd_data[500] = {0};
757
758 memset(&only_info, 0, sizeof(mbtk_ecall_only_info_t));
759
760 if(ecall_init_flag !=1)
761 {
l.yang2678d6f2025-05-28 03:58:49 -0700762 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800763 }
764
765 if(p_info == NULL || p_info->msd_len > GSW_EU_ECALL_MAX_MSD )
766 {
l.yang2678d6f2025-05-28 03:58:49 -0700767 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800768 }
769
770
771 if(p_info->type == GSW_EU_ECALL_TYPE_TEST)
772 {
773 //AT+CECALL =0
774 ecall_type = MBTK_ECALL_DIAL_TYPE_TEST;
775 snprintf(tmp_number,sizeof(tmp_number),"%s",p_info->ecall_number);
776 strncpy((char *)only_info.test_num,tmp_number,RIL_MAX_NUMBER_LEN);
777 //snprintf((char*)only_info.test_num,sizeof(only_info.test_num),"%s",p_info->ecall_number);
778 }
779
780 if(p_info->type == GSW_EU_ECALL_TYPE_RECONFIG )
781 {
782 //AT+CECALL =1
783 ecall_type = MBTK_ECALL_DIAL_TYPE_RECONFIG;
784 snprintf(tmp_number,sizeof(tmp_number),"%s",p_info->ecall_number);
785 strncpy((char *)only_info.test_num,tmp_number,RIL_MAX_NUMBER_LEN);
786 }
787
788 if(p_info->type == GSW_EU_ECALL_TYPE_EMERGENCY )
789 {
790 if(p_info->auto_trigger)
791 {
792 //AT+CECALL =1
793 ecall_type = MBTK_ECALL_DIAL_TYPE_AUTO;
794 }
795 else
796 {
797 //AT+CECALL =1
798 ecall_type = MBTK_ECALL_DIAL_TYPE_MANUALLY;//手动
799 }
800
801 }
802
803 //msd
804 for (int i = 0; i < p_info->msd_len; i++)
805 {
806 sprintf(msd_data + (i * 2), "%02x", p_info->msd[i]);
807 }
808
809 //
810 only_info.active = MBTK_ECALL_ONLY_TYPE_DISABLE ;
811
812 ret=mbtk_ecall_only_set_ptr(ecall_info_handle,&only_info);
813 if (ret != 0)
814 {
815 LOGE("mbtk_ecall_only_set_success failed");
l.yang2678d6f2025-05-28 03:58:49 -0700816 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800817 }
818
819 //set msd
820 ret= mbtk_ecall_msd_set_ptr(ecall_info_handle,(const void*)msd_data);
821 if (ret != 0)
822 {
823 LOGE("mbtk_ecall_msd_set_ptr failed");
l.yang2678d6f2025-05-28 03:58:49 -0700824 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800825 }
826
827 //dial
828 ret= mbtk_ecall_dial_start_ptr(ecall_info_handle,ecall_type);
829 if (ret != 0)
830 {
831 LOGE("mbtk_ecall_dial_start_ptr failed");
l.yang2678d6f2025-05-28 03:58:49 -0700832 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800833 }
834
835 //push mst
836 ret= mbtk_ecall_push_ptr(ecall_info_handle);
837 if (ret != 0)
838 {
839 g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_FAILURE;
840 mbtk_send_singnal();
841 LOGE("mbtk_ecall_push_ptr failed");
l.yang2678d6f2025-05-28 03:58:49 -0700842 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800843 }
844
845 g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_SUCCESS;
846 mbtk_send_singnal();
847 return GSW_HAL_SUCCESS;
848
849}
850
851
852/**
853* @brief hangup a Europe Ecall
854* @param [in] None
855* @param [out] None
856* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
857*/
858int32_t gsw_eu_ecall_hangup(void)
859{
860 int32_t ret = -1;
861 if(ecall_info_handle == NULL)
862 {
l.yang2678d6f2025-05-28 03:58:49 -0700863 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800864 }
865
866 ret = mbtk_ecall_dial_start_ptr(ecall_info_handle,MBTK_ECALL_DIAL_TYPE_RELEASE);
867 if(ret != 0)
868 {
869 LOGE("hangup ecall faile ");
l.yang2678d6f2025-05-28 03:58:49 -0700870 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800871 }
872
873 return GSW_HAL_SUCCESS;
874}
875
876/**
877* @brief using push mode send msd data
878* @param [in] GSW_EU_ECALL_STATE_E state: ecall state
879* @param [out] None
880* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
881*/
882
883int32_t gsw_eu_ecall_updateMsd(const uint8_t *msd, uint32_t msd_len)
884{
885 int ret = -1;
886 char msd_data[500] = {0};
887
888 if(msd == NULL || msd_len == 0 ||ecall_info_handle == NULL)
889 {
l.yang2678d6f2025-05-28 03:58:49 -0700890 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800891 }
892
893 //msd
894 for (int i = 0; i < msd_len; i++)
895 {
896 sprintf(msd_data + i * 2, "%02x", *(msd + i));
897 }
898 ret = mbtk_ecall_msd_set_ptr(ecall_info_handle,(const void*)msd_data);
899 if (ret != 0)
900 {
901 LOGE("mbtk_ecall_msd_get_ptr failed");
l.yang2678d6f2025-05-28 03:58:49 -0700902 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800903 }
904 return GSW_HAL_SUCCESS;
905
906}
907
908
909int32_t gsw_eu_ecall_pushMsd(gsw_eu_ecall_state_e state)
910{
911 int ret = -1;
912 if(ecall_info_handle == NULL)
913 {
l.yang2678d6f2025-05-28 03:58:49 -0700914 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800915 }
916
917 ret = mbtk_ecall_push_ptr(ecall_info_handle);
918 if(ret != 0)
919 {
920 g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_FAILURE;
921 mbtk_send_singnal();
l.yang2678d6f2025-05-28 03:58:49 -0700922 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800923 }
924 g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_SUCCESS;
925 mbtk_send_singnal();
926 return GSW_HAL_SUCCESS;
927
928
929}
930
931/**
932* @brief get ecall config
933* @param [in] None
934* @param [out] gsw_eu_ecall_config_t *p_config: ecall config
935* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
936*/
937int32_t gsw_eu_ecall_getConfig(gsw_eu_ecall_config_t *p_config)
938{
939
940 if(ecall_info_handle==NULL || p_config == NULL)
941 {
942 LOGE("mbtk_ecall_cfg_get() fail.");
l.yang2678d6f2025-05-28 03:58:49 -0700943 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800944 }
945
946 p_config->fail_redial = fail_redial;
947
948 return GSW_HAL_SUCCESS;
949}
950
951/**
952* @brief set ecall config
953* @param [in] int32_t item: config item
954* @param [in] gsw_eu_ecall_config_t *p_config: config info
955* @param [out] None
956* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
957*/
958
959int32_t gsw_eu_ecall_setConfig(int32_t item, gsw_eu_ecall_config_t *p_config)
960{
961 if(ecall_info_handle == NULL || p_config == NULL)
962 {
963 LOGE("gsw_eu_ecall_setConfig no init");
l.yang2678d6f2025-05-28 03:58:49 -0700964 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800965 }
966
967 mbtk_ecall_cfg_info_t cfg_info = {0};
968
969 int ret =-1;
970 cfg_info.type = 0;
971
972 if(item & GSW_EU_ECALL_CONFIG_FAIL_REDIAL)
973 {
974 fail_redial = p_config->fail_redial;
975 if(p_config->fail_redial)
976 {
977 cfg_info.type |= MBTK_ECALL_CFG_TIMER_DIAL;
978 cfg_info.data[MBTK_ECALL_CFG_ITEM_TIMER_DIAL] = 60000;//timer 60s
979
980 }
981 else
982 {
983 cfg_info.type |= MBTK_ECALL_CFG_TIMER_DIAL;
984 cfg_info.data[MBTK_ECALL_CFG_ITEM_TIMER_DIAL] = 0;
985 }
986 }
987
988 ret = mbtk_ecall_cfg_set_ptr(ecall_info_handle, &cfg_info);
989 if (ret < 0)
990 {
991 LOGE("mbtk_ecall_cfg_set_ptr fail");
l.yang2678d6f2025-05-28 03:58:49 -0700992 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800993 }
994 return GSW_HAL_SUCCESS;
995
996}
997
998
999
1000static void mbtk_ecall_state_change_cb(const void* data, int data_len)
1001{
1002 static gsw_eu_ecall_event_t event;
1003 if(data)
1004 {
1005 mbtk_ril_ecall_state_info_t *ecall_data = (mbtk_ril_ecall_state_info_t*)data;
1006 switch(ecall_data->urc_id)
1007 {
1008 case MBTK_ECALL_URC_ID_MSD_REQ:
1009 {
1010 LOGD("MBTK_ECALL_URC_ID_MSD_REQ");
1011 event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_START_RECEIVED_MSD;
1012 event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPDATE_PSAP_REQURE_UPDATE_MSD;
1013 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;
1014 event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_NONE;
1015 break;
1016 }
1017 case MBTK_ECALL_URC_ID_MSD_SEND_START:
1018 {
1019 LOGD("MBTK_ECALL_URC_ID_MSD_SEND_START");
1020
1021 event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_START_RECEIVED_MSD;
1022 event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPDATE_PSAP_REQURE_UPDATE_MSD;
1023 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;
1024 event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_NONE;
1025 break;
1026 }
1027 case MBTK_ECALL_URC_ID_NACK:
1028 {
1029 LOGD("MBTK_ECALL_URC_ID_NACK");
1030
1031 event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_NACK_RECEIVED;
1032 event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPADTE_NONE;
1033 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;
1034 event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_NONE;
1035 break;
1036 }
1037 case MBTK_ECALL_URC_ID_LLACK:
1038 {
1039 LOGD("MBTK_ECALL_URC_ID_LLACK");
1040
1041 event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_ACK_RECEIVED;
1042 event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPADTE_NONE;
1043 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_IVS_LLACK_RECEIVED;
1044 event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_SUCCESS;
1045 g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_SUCCESS;
1046 mbtk_send_singnal();
1047 break;
1048 }
1049 case MBTK_ECALL_URC_ID_HLACK:
1050 {
1051 LOGD("MBTK_ECALL_URC_ID_HLACK");
1052 event.fail = GSW_EU_ECALL_EVENT_FAIL_NONE;
1053 event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_HLACK_RECEIVED;
1054
1055 event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPADTE_NONE;
1056 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;
1057 event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_SUCCESS;
1058 g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_SUCCESS;
1059 mbtk_send_singnal();
1060 break;
1061 }
1062 case MBTK_ECALL_URC_ID_ALACK:
1063 {
1064 LOGD("MBTK_ECALL_URC_ID_ALACK");
1065 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_IVS_ALACK_RECEIVED;
1066 }
1067 case MBTK_ECALL_URC_ID_MSD_UPDATE_DONE:
1068 {
1069 LOGD("MBTK_ECALL_URC_ID_MSD_UPDATE_DONE");
1070 event.process = GSW_EU_ECALL_EVENT_PROCESS_IVS_NONE;
1071 event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPADTE_NONE;
1072 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;
1073 event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_SUCCESS;
1074
1075 }
1076 case MBTK_ECALL_URC_ID_T5_EXPIRED:
1077 case MBTK_ECALL_URC_ID_T6_EXPIRED:
1078 case MBTK_ECALL_URC_ID_T7_EXPIRED:
1079 {
1080 LOGD("MBTK_ECALL_URC_ID_T5_EXPIRED | MBTK_ECALL_URC_ID_T5_EXPIRED | MBTK_ECALL_URC_ID_T7_EXPIRED");
1081 event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPDATE_IVS_UPDATE_MSD_TIMEOUT;
1082 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;
1083 event.establish = GSW_EU_ECALL_EVENT_ESTABLISH_SUCCESS;
1084 g_msd_send_status = GSW_EU_ECALL_MSD_TRANS_STATUS_FAILURE;
1085 mbtk_send_singnal();
1086 break;
1087 }
1088 case MBTK_ECALL_URC_ID_3GPP_FATAL:
1089 case MBTK_ECALL_URC_ID_GENERIC:
1090 {
1091 LOGD("MBTK_ECALL_URC_ID_GENERIC|MBTK_ECALL_URC_ID_3GPP_FATAL");
1092 event.extend_state = GSW_EU_ECALL_EVENT_EXTEND_STATE_NONE;
1093 }
1094 case MBTK_ECALL_URC_ID_MSD_UPDATE_ERR:
1095 {
1096 LOGD("MBTK_ECALL_URC_ID_MSD_UPDATE_ERR");
1097 event.msdupdate = GSW_EU_ECALL_EVENT_MSDUPDATE_IVS_UPDATE_MSD_TIMEOUT;
1098
1099 }
1100 default:
1101 {
1102
1103 LOGE("No process urc_id : %d", ecall_data->urc_id);
1104 break;
1105 }
1106 }
1107
1108 }
1109 if(gsw_eu_ecall_event_cb)
1110 {
1111 gsw_eu_ecall_event_cb(&event);
1112 }
1113}
1114
1115
1116/**
1117 * @brief register the ecall status callback
1118* @param [in] gsw_eu_ecall_status_cb_f cb:callback
1119* @param [out] None
1120* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
1121*/
1122int32_t gsw_eu_ecall_setEventCB(gsw_eu_ecall_event_cb_f cb)
1123{
1124 int ret = -1;
1125 if(ecall_info_handle==NULL)
1126 {
l.yang2678d6f2025-05-28 03:58:49 -07001127 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001128 }
1129
1130 gsw_eu_ecall_event_cb = cb;
1131 if(!g_setevent_cb)
1132 {
1133 ret = mbtk_ecall_state_change_cb_reg_ptr(ecall_info_handle, mbtk_ecall_state_change_cb);
1134 if(ret < 0)
1135 {
1136
1137 LOGE("mbtk_ecall_state_change_cb_reg_ptr failed");
l.yang2678d6f2025-05-28 03:58:49 -07001138 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001139 }
1140 g_setevent_cb = true;
1141 }
1142
1143 return GSW_HAL_SUCCESS;
1144
1145}
1146
1147
1148
1149static void* ecall_msd_status_cb_thread(void* arg)
1150{
1151 while(g_thread_running)
1152 {
1153 mbtk_wait_signal();
1154 if(g_thread_running == false)
1155 {
1156 return NULL;
1157 }
1158 if(gsw_eu_ecall_status_cb)
1159 {
1160 gsw_eu_ecall_status_cb(g_sta_cb_id,g_msd_send_status);
1161 }
1162
1163 }
1164 return NULL;
1165}
1166
1167/**
1168* @brief register the ecall status callback
1169* @param [in] gsw_eu_ecall_status_cb_f cb:callback
1170* @param [out] None
1171* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
1172*/
1173int32_t gsw_eu_ecall_setStatusCB(gsw_eu_ecall_status_cb_f cb)
1174{
1175 int ret = -1;
1176 if(ecall_info_handle==NULL)
1177 {
l.yang2678d6f2025-05-28 03:58:49 -07001178 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001179 }
1180 gsw_eu_ecall_status_cb = cb;
1181 if (!g_thread_running)
1182 {
1183 ret = pthread_create(&gsw_ecall_status_cb_thread, NULL, ecall_msd_status_cb_thread, NULL);
1184 if(ret < 0)
1185 {
1186 LOGE("pthread_create failed");
1187 g_thread_running = false;
l.yang2678d6f2025-05-28 03:58:49 -07001188 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001189 }
1190 g_thread_running = true;
1191 }
1192
1193 return GSW_HAL_SUCCESS;
1194
1195}