1 /******************************************************************************
2 ###############################################################################
3 # Copyright (c) [2017-2020] [ICT/CAS] #
4 # Licensed under the ORAN Software License v1.0 (License) #
5 ###############################################################################
6 ******************************************************************************/
9 #ifndef __VOS_MODULE_H__
10 #define __VOS_MODULE_H__
12 #include "vos_types.h"
13 #include "vos_timer.h"
15 #include "vos_socket.h"
20 #define MODULE_NAME_LEN (48)
24 typedef enum module_type_e{
25 VOS_MOD_T_NORMAL = 0, ///< 一般模块
26 VOS_MOD_T_HOST, ///< host task
27 VOS_MOD_T_USER, ///< user task
28 VOS_MOD_T_EXTERN, ///< 外部模块 (不是 vos app 中的模块,其他的进程 )
33 typedef enum module_comm_type_e{
34 VOS_MOD_COMM_T_VOS = (1 << 0), ///< vos 模块间通信
35 VOS_MOD_COMM_T_UNIX_UDP_C = (1 << 1), ///< unix socket udp client
36 VOS_MOD_COMM_T_UNIX_UDP_S = (1 << 2), ///< unix socket udp server
37 VOS_MOD_COMM_T_UNIX_TCP_C = (1 << 3), ///< unix socket tcp client
38 VOS_MOD_COMM_T_UNIX_TCP_S = (1 << 4), ///< unix socket tcp server
39 VOS_MOD_COMM_T_UDP_C = (1 << 5), ///< udp client
40 VOS_MOD_COMM_T_UDP_S = (1 << 6), ///< udp server
41 VOS_MOD_COMM_T_TCP_C = (1 << 7), ///< tcp client
42 VOS_MOD_COMM_T_TCP_S = (1 << 8), ///< tcp server
43 VOS_MOD_COMM_T_SCTP_ONE2ONE_C = (1 << 9), ///< sctp one2one client
44 VOS_MOD_COMM_T_SCTP_ONE2ONE_S = (1 << 10), ///< sctp one2one server
45 VOS_MOD_COMM_T_SCTP_ONE2MANY_C = (1 << 11), ///< sctp one2many client
46 VOS_MOD_COMM_T_SCTP_ONE2MANY_S = (1 << 12), ///< sctp one2many server
47 VOS_MOD_COMM_T_SOCK_OP = (1 << 13), ///< socket
48 VOS_MOD_COMM_T_MAX, ///< max
53 typedef struct vos_module_s{
54 module_type_t modType; ///< 模块类型
55 LONG commType; ///< 当前的通信类型
56 ULONG moduleID; ///< 模块ID
57 CHAR name[MODULE_NAME_LEN]; ///< 模块名
58 ULONG queueID; ///< 模块消息队列,用于接收从其他模块发送过来的消息
59 LONG paraCount; ///< 无需关心, (添加的额外参数个数)
60 void *pPara; ///< 无需关心, (vos_mod_com_para_cb_t)
61 LONG paraLock; ///< 无需关心,
65 /** 采用非VOS通信方式的模块需要提供的handle函数,用于接收数据
68 * opval 额外信息,类型为 vos_mod_com_op_t
72 typedef LONG (*receive_handler)(VOID *buf,LONG size,VOID *opval,LONG opvalLen);
78 * @param[in ] name 模块名,大小为 MODULE_NAME_LEN
79 * @param[in] module 模块管理信息
81 * module.queueID 用于模块间通信
82 * module.mod_type 模块类型
83 * @param[out] module 模块管理信息
87 * @return VOS_OK - 成功,其他 - 失败
89 LONG VOS_module_register(const CHAR *name,vos_module_t *module);
95 * @param[in ] name 模块名,大小为 MODULE_NAME_LEN
96 * @return VOS_OK - 成功,其他 - 失败
98 LONG VOS_module_deregister(const CHAR *name);
103 * @param[in ] id 模块ID
104 * @param[out] name 模块名,大小为 MODULE_NAME_LEN
105 * @return VOS_OK - 成功,其他 - 失败
107 LONG VOS_module_get_name(ULONG id,CHAR name[MODULE_NAME_LEN]);
111 * @param[in ] name 模块名,大小为 MODULE_NAME_LEN
112 * @return 成功返回模块ID,失败返回 0
114 ULONG VOS_module_get_Id(CHAR *name);
119 * @param[in ] dst_slot 目的槽位号
120 * @param[in ] dst_moduleName 目的模块名,大小为 MODULE_NAME_LEN
121 * @param[in ] src_moduleName 源模块名,大小为 MODULE_NAME_LEN
122 * @param[in ] msgCode 消息码
123 * @param[in ] msgData 消息数据
124 * @param[in ] msgDataLen 消息数据长度
125 * @return 成功返回 VOS_OK,失败返回 其他
127 LONG VOS_SendAsynMsg2Module(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
128 LONG msgCode,VOID *msgData,LONG msgDataLen);
132 * @param[in ] dst_slot 目的槽位号
133 * @param[in ] dst_moduleName 目的模块名,大小为 MODULE_NAME_LEN
134 * @param[in ] src_moduleName 源模块名,大小为 MODULE_NAME_LEN
135 * @param[in ] msgCode 消息码
136 * @param[in ] msgData 消息数据,如果没有则填 NULL
137 * @param[in ] msgDataLen 消息数据长度,如果msgData 为NULL 填0
138 * @param[out] ackData 接收返回数据的buf
139 * @param[in ] ackDataLen 输入:接收返回数据buf的长度
140 * @param[out] ackDataLen 输出:buf的有效长度
141 * @param[in ] timeout 等待接收的时间,单位毫秒,调用者自行判断需要等待时间,一般等待 5秒
142 * @return 成功返回 VOS_OK,失败返回 其他
144 LONG VOS_SendSynMsg2Module(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
145 LONG msgCode,VOID *msgData,LONG msgDataLen,VOID *ackData,LONG *ackDataLen,LONG timeout);
150 * 向某个模块发送异步消息,支持非VOS通信方式
151 * @param[in ] dst_slot 目的槽位号
152 * @param[in ] dst_moduleName 目的模块名,大小为 MODULE_NAME_LEN
153 * @param[in ] src_moduleName 源模块名,大小为 MODULE_NAME_LEN
154 * @param[in ] msgCode 消息码
155 * @param[in ] msgData 消息数据
156 * @param[in ] msgDataLen 消息数据长度
157 * @param[in ] commType 通信方式
158 * @param[in ] optval 可选参数,不需要则填NULL
159 * @param[in ] optlen 可选参数长度
160 * @return 成功返回 VOS_OK,失败返回 其他
162 LONG VOS_SendAsynMsg2ModuleEx(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
163 LONG msgCode,VOID *msgData,LONG msgDataLen,
164 module_comm_type_t commType,VOID *optval,LONG optlen);
168 * 向某个模块发送同步消息,仅支持VOS通信方式
169 * @param[in ] dst_slot 目的槽位号
170 * @param[in ] dst_moduleName 目的模块名,大小为 MODULE_NAME_LEN
171 * @param[in ] src_moduleName 源模块名,大小为 MODULE_NAME_LEN
172 * @param[in ] msgCode 消息码
173 * @param[in ] msgData 消息数据,如果没有则填 NULL
174 * @param[in ] msgDataLen 消息数据长度,如果msgData 为NULL 填0
175 * @param[out] ackData 接收返回数据的buf
176 * @param[in ] ackDataLen 输入:接收返回数据buf的长度
177 * @param[out] ackDataLen 输出:buf的有效长度
178 * @param[in ] timeout 等待接收的时间,单位毫秒,调用者自行判断需要等待时间,一般等待 5秒
179 * @param[in ] commType 通信方式
180 * @param[in ] optval 可选参数,不需要则填NULL
181 * @param[in ] optlen 可选参数长度
182 * @return 成功返回 VOS_OK,失败返回 其他
184 LONG VOS_SendSynMsg2ModuleEx(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
185 LONG msgCode,VOID *msgData,LONG msgDataLen,VOID *ackData,LONG *ackDataLen,LONG timeout,
186 module_comm_type_t commType,VOID *optval,LONG optlen);
188 LONG VOS_SendAsynMsg2Module_Raw(LONG dst_slot,CHAR dst_moduleName[MODULE_NAME_LEN],CHAR src_moduleName[MODULE_NAME_LEN],
189 ULONG aulMsg[VOS_QUEUE_MSG_SIZE]);
195 * @param[in ] aulMsg VOS_QueReceive 收到的原始消息
196 * @param[in ] ackData 返回数据的buf
197 * @param[in ] ackDataLen 返回数据buf的长度
198 * @return 成功返回 VOS_OK,失败返回 其他
200 LONG VOS_SendSynAckMsg(ULONG aulMsg[VOS_QUEUE_MSG_SIZE],VOID *ackData,LONG ackDataLen);
205 * @param[in ] module_ID 要注册timer msg的模块号
206 * @param[in ] msg_code 消息码
207 * @param[in ] interval 发送间隔,毫秒
208 * @param[in ] type 类型,循环或者只执行一次
209 * @param[in ] pArg 附加参数,一般为一个指针
210 * @return 成功返回 VOS_OK,失败返回 其他
212 LONG VOS_RegTimerMsg(LONG module_ID,LONG msg_code,LONG interval,VOS_TIMER_TYPE_EN type,VOID *pArg);
217 * @param[in ] module_ID 要注销timer msg的模块号
218 * @param[in ] msg_code 消息码
219 * @return 成功返回 VOS_OK,失败返回 其他
221 LONG VOS_DeregTimerMsg(LONG module_ID,LONG msg_code);
224 /** 从原始消息中获取消息类型 (同步/异步) */
225 #define VOS_MOD_MSG_GET_EVENT_TYPE(aulMsg) aulMsg[0]
228 #define VOS_MOD_MSG_GET_CODE(aulMsg) ((SYS_MSG_S *)(aulMsg[3]))->usMsgCode
232 #define VOS_MOD_MSG_GET_SRC_ID(aulMsg) ((SYS_MSG_S *)(aulMsg[3]))->ulSrcModuleID
236 #define VOS_MOD_MSG_GET_DST_ID(aulMsg) ((SYS_MSG_S *)(aulMsg[3]))->ulDstModuleID
240 #define VOS_MOD_MSG_GET_SRC_SLOT(aulMsg) ((SYS_MSG_S *)(aulMsg[3]))->ulSrcSlotID
244 #define VOS_MOD_MSG_GET_DST_SLOT(aulMsg) ((SYS_MSG_S *)(aulMsg[3]))->ulDstSlotID
248 #define VOS_MOD_MSG_GET_LEN(aulMsg) ((SYS_MSG_S *)(aulMsg[3]))->usFrameLen
250 /** 从原始消息中获取消息buf 的指针 */
251 #define VOS_MOD_MSG_GET_DATAPTR(aulMsg) ((SYS_MSG_S *)(aulMsg[3]))->ptrMsgBody
253 /** 从原始消息中拷贝消息到dst中 */
254 #define VOS_MOD_MSG_GET_DATA(dst,aulMsg) if( NULL != VOS_MOD_MSG_GET_DATAPTR(aulMsg) ) \
255 { VOS_MemCpy(dst,VOS_MOD_MSG_GET_DATAPTR(aulMsg),VOS_MOD_MSG_GET_LEN(aulMsg)); } \
259 /** 释放原始消息中的sys msg */
260 #define VOS_MOD_MSG_FREE(aulMsg) VOS_Free((VOID *)aulMsg[3])
263 /** msg handler的函数原型 */
264 typedef LONG(*VOS_msg_code_handler_ptr)(ULONG aulMsg[VOS_QUEUE_MSG_SIZE]);
267 /** 用于模块间通信的code 和 handler的map */
268 typedef struct msg_code_handle_map_s
270 LONG msg_code; ///< 消息码
271 VOS_msg_code_handler_ptr handler; ///< 消息码的处理函数
272 }VOS_msg_code_handle_map_t;
276 #endif /* __VOS_MODULE_H__ */