45a536b82a11788889a0ed279188cb6971188de8
[scp/ocu/5gnr.git] / Include / vos_lib.h
1 /******************************************************************************
2 ###############################################################################
3 #   Copyright (c) [2017-2020] [ICT/CAS]                                        #
4 #   Licensed under the ORAN Software License v1.0 (License)             #
5 ###############################################################################
6 ******************************************************************************/
7
8 #ifndef _VOS_LIB_H_
9 #define _VOS_LIB_H_
10
11 #ifdef __cplusplus
12     extern "C" {
13 #endif
14
15 #include "vos_types.h"
16 #include "vos_module.h"
17 #include <stdarg.h>
18 #include "plat_syslog.h"
19 #include <stdio.h>
20
21
22
23 #define FILE_PATH_MAX 4096
24
25
26 /** 
27  * VOS 平台初始化
28  * @param[in]   appPath      APP文件路径
29  * @param[in]   cfgPath      vos config 文件路径
30  * @param[in]   mods         定义已存在模块的数组
31  * @param[in]   num          mods数组大小
32  * @return      成功时返回申请内存的地址,失败则返回NULL。
33  */ 
34 LONG VOS_Init(const CHAR *appPath,const CHAR *cfgPath,vos_module_t * mods,INT num);
35
36
37 /** 
38  * 分配内存
39  * @param[in]   ulSize      申请内存的大小
40  * @param[in]   ulModuleId  申请模块的模块ID
41  * @return      成功时返回申请内存的地址,失败则返回NULL。
42  */ 
43 #define VOS_Malloc(ulSize,ulModuleId) VOS_MallocWithDebug(ulSize,ulModuleId,(UCHAR *)__FILE__,__LINE__)
44
45
46 /** 
47  * 释放内存
48  * @param[in]   ptr      释放内存的指针
49  */ 
50 #define VOS_Free(ptr) VOS_Free_Debug(ptr,(UCHAR *)__FILE__,__LINE__)
51
52
53 /** 
54  * 根据bExp判断是否打印调用栈
55  * @param[in]   exp        当bExp为假时打印调用栈
56  */ 
57 #define VOS_ASSERT(exp)   VOS_ASSERT_X( (LONG)(exp), __FILE__, __LINE__ , 0)
58
59
60 /** 
61  * 格式化输出到默认输出 
62  * 注意 LONG 输出时,要用%ld,或%lx
63  * @param[in]   format    格式字符串
64  * @param[in]   ...       要输出的变量
65  * @return      返回输出的字节数
66  */ 
67 ULONG VOS_Printf(const CHAR *format ,...);
68
69
70 /** 
71  * 格式化输出到指定字符串中
72  * @param[in]   buf       输出位置
73  * @param[in]   fmt       格式字符串
74  * @param[in]   ...       要输出的变量
75  * @return      返回输出的字节数
76  */ 
77 ULONG VOS_Sprintf(CHAR *buf ,CHAR *fmt, ...);
78
79
80 /** 
81  * 格式化输出到指定字符串中
82  * @param[in]   buf       输出位置
83  * @param[in]   size      buf的大小
84  * @param[in]   fmt       格式字符串
85  * @param[in]   ...       要输出的变量
86  * @return      返回输出的字节数
87  */ 
88 ULONG VOS_Snprintf(CHAR *buf, ULONG size, CHAR *fmt, ...);
89
90
91 /** 
92  * 读取格式化的字符串中的数据
93  * @param[in]   buf       要读取的字符串
94  * @param[in]   fmt       读取格式
95  * @param[in]   ...       存储数据的指针
96  * @return      返回成功读取的字段个数
97  */ 
98 ULONG VOS_Sscanf(const CHAR * buf, const CHAR * fmt,...);
99
100
101 /** 同qsort */
102 VOID VOS_qsort(VOID *base, INT nmemb, INT size,
103                   INT (*compar)(const VOID *, const VOID *));
104
105 /** 同 vsnprintf */
106 ULONG VOS_Vsnprintf(CHAR * buf, ULONG size, const CHAR * fmt, va_list args);
107
108 /** 同 vsprintf */
109 ULONG VOS_Vsprintf(CHAR * buf, const CHAR * fmt, va_list args);
110
111 /** 
112  * 判断文件是否存在
113  * @param[in]   path      文件路径
114  * @return      path存在返回TURE,不存在则返回FALSE
115  */ 
116 BOOL VOS_file_exist(const CHAR *path);
117
118 #define NUM_LIST_MAX 4096
119
120 /** 
121  * 将数值list字符串(1-6,8,13)转换为,数组
122  * @param[in ]   list      数值字符串
123  * @param[out]   numList   解析后的数值数组
124  * @return      成功解析的个数
125  */ 
126 LONG parseNumList(const CHAR * list,ULONG numList[NUM_LIST_MAX]);
127
128
129 /** 
130  * 将数值list字符串(1-6,8,13)转换为一个ULONG bitmap
131  * @param[in ]   list      数值字符串
132  * @param[out]   map       解析后的bitmap
133  * @return      成功返回VOS_OK,失败返回其他
134  */ 
135 LONG parseNumList2BitMap(const CHAR * list,ULONG *map);
136
137 /** 
138  * 延时
139  * @param[in ]   seconds      延时的秒数
140  */
141 VOID VOS_Sleep(LONG seconds);
142
143 typedef VOID( *VOS_SIGNAL_FUNC ) ( int signal);
144
145 /** 
146  * vos信号处理回调函数注册
147  * @param[in ]   sig                            信号
148  * @param[in ]   sig_handler            回调函数
149  * @return      成功返回VOS_OK,失败返回VOS_ERROR
150  */ 
151 LONG Vos_Signal(int sig, VOS_SIGNAL_FUNC sig_handler);
152
153 /** 
154  * product信号处理回调函数注册
155  * @param[in ]   sig                            信号
156  * @param[in ]   status                 是否退出
157  * @param[in ]   sig_handler            回调函数
158  * @return      成功返回VOS_OK,失败返回VOS_ERROR
159  */ 
160 LONG Product_Signal(int sig,     ULONG status, VOS_SIGNAL_FUNC sig_handler);
161
162 /** 
163  * product最后处理的信号回调函数注册
164  * @param[in ]   sig                            信号
165  * @param[in ]   status                 是否退出
166  * @param[in ]   sig_handler            回调函数
167  * @return      成功返回VOS_OK,失败返回VOS_ERROR
168  */ 
169 LONG Product_Signal_Last(int sig,        ULONG status, VOS_SIGNAL_FUNC sig_handler);
170
171 /** 
172  * 信号处理模块初始化
173  * @param[in ]   signal                 信号
174  * @return      成功返回VOS_OK,失败返回VOS_ERROR
175  */ 
176 LONG Vos_SignalInit();
177
178 //信号最小值
179 #define SIGNAL_MIN                              0
180
181 //信号最大值
182 #define SIGNAL_MAX                              65
183
184 /** VOS 消息类型 */
185 typedef enum VOS_MOD_EVENT_TYPE_S
186 {
187     VOS_MOD_EVENT_TYPE_ASYN   = 1,           ///< 异步消息
188     VOS_MOD_EVENT_TYPE_SYN    = 2,           ///< 同步消息
189     VOS_MOD_EVENT_TYPE_TIMER  = 3,           ///< 定时器消息
190     VOS_MOD_EVENT_TYPE_MAX    = 0x100,       ///< VOS 占用最大消息类型ID
191 }VOS_MOD_EVENT_TYPE_T;
192
193 #define VOS_MOD_EVENT_TYPE_MAC_UL   (VOS_MOD_EVENT_TYPE_MAX+1)
194
195
196 /*=========================================================================================================================*/
197 /* ###### 下面的函数不要直接调用,使用上面提供的宏 ###### */
198 /** 
199  * 分配内存,不要直接调用该API,通过宏 VOS_Malloc 调用
200  * @param[in]   size      申请内存的大小
201  * @param[in]   moduleId  申请内存的模块ID
202  * @param[in]   file      申请内存处的文件名
203  * @param[in]   line      申请内存处的行号
204  * @return      成功时返回申请内存的地址,失败则返回NULL。
205  */ 
206 void* VOS_MallocWithDebug(unsigned long size, unsigned long moduleId, unsigned char *file, unsigned long line);
207
208 /** 
209  * 释放内存,不要直接调用该API,通过宏 VOS_Free 调用
210  * @param[in]   ptr       释放内存的地址
211  * @param[in]   file      释放内存处的文件名
212  * @param[in]   line      释放内存处的行号
213  * @return
214  */ 
215 void VOS_Free_Debug(const void *ptr,  UCHAR *file, ULONG line);
216
217 /** 
218  * 打印断言,根据bExp判断是否打印调用栈,不要直接调用该API,通过宏 VOS_ASSERT 调用
219  * @param[in]   bExp        当bExp为假时打印调用栈
220  * @param[in]   szFileName  打印处的文件名
221  * @param[in]   iLine       打印处的行号
222  * @param[in]   bOutConsole 输出fd
223  */ 
224 VOID VOS_ASSERT_X( BOOL bExp, CHAR *szFileName, INT iLine , INT bOutConsole);
225
226 /******计算某个函数运行时间******/
227 extern ULONG gTimerTickPerNsec;
228 uint64_t timer_get_ticks_diff(uint64_t CurrTick, uint64_t LastTick);
229 uint64_t timer_get_ticks(void);
230
231
232
233 #define VOS_CALC_ELAPSED_TIME_NS(func)                  \
234 ({                                                                              \
235         uint64_t start, end;                    \
236         uint64_t diff;                                                  \
237         start = timer_get_ticks();      \
238         func;                                                           \
239         end = timer_get_ticks();         \
240         diff = timer_get_ticks_diff(end,start);\
241         vos_info_print("func %s spend diff %ld,gTimerTickPerNsec %ld, time = %ld ns,\n",#func ,diff,gTimerTickPerNsec,diff/gTimerTickPerNsec);\
242 })
243
244 #define __vos_start_tick()  uint64_t start_tick = timer_get_ticks(),cur_tick = 0;
245 #define __vos_diff_tick()   cur_tick = timer_get_ticks();printf("%s.%d  diff ticks %ld \r\n",__func__,__LINE__,timer_get_ticks_diff(cur_tick,start_tick));start_tick = timer_get_ticks();
246
247 typedef LONG (*vos_print_wrapper_func_t)(void *dst,const char * format,...);
248 LONG vos_vty_out_wrapper(void *vty,const char * format, ... );
249 LONG vos_printf_wrapper(void *vty,const char * format, ... );
250
251 //#####################################################################################
252 // 未包含设备管理模块时需要添加的宏
253 #ifndef PLAT_MODULE_DEVSM
254 #define SYS_LOCAL_MODULE_SLOTNO_GET (1)
255 #define SYS_MODULE_IS_RUNNING(slotno) (VOS_TRUE)
256
257 #endif
258
259 //#####################################################################################
260 typedef enum {
261     _vos_print_lv_info = 0,
262     _vos_print_lv_warning,
263     _vos_print_lv_err,
264     _vos_print_lv_max
265 }_vos_print_lv;
266
267
268 // 带颜色的打印,开发调试时使用
269 #define VOS_COLOR_NONE "\033[m"
270 #define VOS_COLOR_RED "\033[1;31m"
271 #define VOS_COLOR_BLUE "\033[1;34m"
272 #define VOS_COLOR_PURPLE "\033[1;35m"
273 #define VOS_COLOR_GREEN "\033[1;32m"
274
275
276 extern BOOL vos_info_print_filter_is_filtered(LONG lv,const char *val);
277 #define __is_p_(lv,val) vos_info_print_filter_is_filtered(lv,val)
278 #define __print_check(lv,func,line)  char tmp1[200];snprintf(tmp1,sizeof(tmp1),"%s.%d",func,line);if( !( __is_p_(lv,tmp1)||__is_p_(lv,func)))
279 extern int sprintf(char *str, const char *format, ...);
280 #define vos_raw_print(_format, ...)  printf(_format, ##__VA_ARGS__)
281 #define vos_info_print(_format, ...)  {__print_check(_vos_print_lv_info,__func__,__LINE__){vos_raw_print(VOS_COLOR_BLUE"%s.%d:" _format VOS_COLOR_NONE"",__func__,__LINE__,##__VA_ARGS__);}}
282 #ifdef VOS_log
283 extern vos_module_t module_print_filter;
284 #define __log_mid module_print_filter.moduleID
285 #define vos_warning_print(_format, ...)  {__print_check(_vos_print_lv_warning,__func__,__LINE__){vos_raw_print(VOS_COLOR_PURPLE"%s.%d:"_format VOS_COLOR_NONE"",__func__,__LINE__,##__VA_ARGS__);VOS_log(__log_mid,SYSLOG_WARNING,_format, ##__VA_ARGS__);}}
286 #define vos_err_print(_format, ...)  {__print_check(_vos_print_lv_err,__func__,__LINE__){vos_raw_print(VOS_COLOR_RED"%s.%d:"_format VOS_COLOR_NONE"",__func__,__LINE__,##__VA_ARGS__);VOS_log(__log_mid,SYSLOG_ERR,_format, ##__VA_ARGS__);}}
287 #define vos_perror(_format, ...)  {__print_check(_vos_print_lv_err,__func__,__LINE__){char tmp[200];vos_raw_print(VOS_COLOR_RED"%s.%d:",__func__,__LINE__);vos_raw_print(_format, ##__VA_ARGS__);sprintf(tmp,"%m");vos_raw_print(": %s",tmp);vos_raw_print(VOS_COLOR_NONE"");VOS_log(__log_mid,SYSLOG_ERR,_format, ##__VA_ARGS__);}}
288 #else
289 #define vos_warning_print(_format, ...)  {__print_check(_vos_print_lv_warning,__func__,__LINE__){vos_raw_print(VOS_COLOR_PURPLE"%s.%d:"_format VOS_COLOR_NONE"",__func__,__LINE__,##__VA_ARGS__);}}
290 #define vos_err_print(_format, ...)  {__print_check(_vos_print_lv_err,__func__,__LINE__){vos_raw_print(VOS_COLOR_RED"%s.%d:"_format VOS_COLOR_NONE"",__func__,__LINE__,##__VA_ARGS__);}}
291 #define vos_perror(_format, ...)  {__print_check(_vos_print_lv_err,__func__,__LINE__){char tmp[200];vos_raw_print(VOS_COLOR_RED"%s.%d:",__func__,__LINE__);vos_raw_print(_format, ##__VA_ARGS__);sprintf(tmp,"%m");vos_raw_print(": %s",tmp);vos_raw_print(VOS_COLOR_NONE"");}}
292 #endif
293
294 #define NULL_CHECK(p) if(NULL == p) {vos_err_print(#p" is null\r\n");return VOS_ERROR;}
295
296 #define NULL_CHECK_RP(p) if(NULL == p) {vos_err_print(#p" is null\r\n");return NULL;}
297
298
299 #define RET_CHECK(bool,p) if(bool) {vos_err_print(#p" error\r\n");return VOS_ERROR;}
300
301 LONG VOS_mini_Init(VOID);// 调试时使用
302 LONG VOS_mini_Init_task(VOID);
303 LONG VOS_mini_Init_cli(VOID);
304 LONG VOS_mini_Init_cli_db(const CHAR *appPath,const CHAR *cfgPath,vos_module_t * mods,INT num);
305 LONG VOS_mini_Init_cli_alarm(const CHAR *appPath,const CHAR *cfgPath,vos_module_t * mods,INT num);
306
307
308 #ifdef __cplusplus
309     }
310 #endif
311
312 #endif /*_VOS_LIB_H_*/