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