leodos_libcfs/cfe/evs/
event.rs1use crate::cfe::es::app::AppId;
3use crate::cfe::time::SysTime;
4use crate::error::{CfsError, Result};
5use crate::ffi::{self, CFE_EVS_BinFilter_t};
6use crate::status::check;
7
8#[derive(Debug, Clone, Copy)]
10#[repr(u16)]
11pub enum EventType {
12 Debug = ffi::CFE_EVS_EventType_CFE_EVS_EventType_DEBUG as u16,
14 Info = ffi::CFE_EVS_EventType_CFE_EVS_EventType_INFORMATION as u16,
16 Error = ffi::CFE_EVS_EventType_CFE_EVS_EventType_ERROR as u16,
18 Critical = ffi::CFE_EVS_EventType_CFE_EVS_EventType_CRITICAL as u16,
20}
21
22#[repr(transparent)]
24pub struct BinFilter(CFE_EVS_BinFilter_t);
25
26impl BinFilter {
27 pub fn new(event_id: u16, mask: u16) -> Self {
33 BinFilter(CFE_EVS_BinFilter_t {
34 EventID: event_id,
35 Mask: mask,
36 })
37 }
38
39 pub fn event_id(&self) -> u16 {
41 self.0.EventID
42 }
43
44 pub fn mask(&self) -> u16 {
46 self.0.Mask
47 }
48}
49
50pub fn register(filters: &[BinFilter]) -> Result<()> {
59 let status = if filters.is_empty() {
61 unsafe {
62 ffi::CFE_EVS_Register(
63 core::ptr::null(),
64 0,
65 ffi::CFE_EVS_EventFilter_CFE_EVS_EventFilter_BINARY as u16,
66 )
67 }
68 } else {
69 unsafe {
70 ffi::CFE_EVS_Register(
71 filters.as_ptr() as *const core::ffi::c_void,
72 filters.len() as u16,
73 ffi::CFE_EVS_EventFilter_CFE_EVS_EventFilter_BINARY as u16,
74 )
75 }
76 };
77 check(status)?;
78 Ok(())
79}
80
81pub fn send(event_id: u16, event_type: EventType, message: &str) -> Result<()> {
93 let mut c_message: heapless::CString<{ ffi::CFE_MISSION_EVS_MAX_MESSAGE_LENGTH as usize }> =
96 heapless::CString::new();
97
98 c_message
99 .extend_from_bytes(message.as_bytes())
100 .map_err(|_| CfsError::ValidationFailure)?;
101
102 let status = unsafe {
103 ffi::CFE_EVS_SendEvent(
105 event_id,
106 event_type as ffi::CFE_EVS_EventType_Enum_t,
107 "%s\0".as_ptr() as *const libc::c_char,
108 c_message.as_ptr(),
109 )
110 };
111 check(status)?;
112 Ok(())
113}
114
115pub fn debug(event_id: u16, message: &str) -> Result<()> {
117 send(event_id, EventType::Debug, message)
118}
119
120pub fn info(event_id: u16, message: &str) -> Result<()> {
122 send(event_id, EventType::Info, message)
123}
124
125pub fn error(event_id: u16, message: &str) -> Result<()> {
127 send(event_id, EventType::Error, message)
128}
129
130pub fn critical(event_id: u16, message: &str) -> Result<()> {
132 send(event_id, EventType::Critical, message)
133}
134
135impl AppId {
136 pub fn send_event(&self, event_id: u16, event_type: EventType, message: &str) -> Result<()> {
145 let mut c_message: heapless::CString<{ ffi::CFE_MISSION_EVS_MAX_MESSAGE_LENGTH as usize }> =
146 heapless::CString::new();
147
148 c_message
149 .extend_from_bytes(message.as_bytes())
150 .map_err(|_| CfsError::ValidationFailure)?;
151
152 let status = unsafe {
153 ffi::CFE_EVS_SendEventWithAppID(
154 event_id,
155 event_type as ffi::CFE_EVS_EventType_Enum_t,
156 self.0,
157 "%s\0".as_ptr() as *const libc::c_char,
158 c_message.as_ptr(),
159 )
160 };
161 check(status)?;
162 Ok(())
163 }
164}
165
166pub fn send_timed_event(
168 time: SysTime,
169 event_id: u16,
170 event_type: EventType,
171 message: &str,
172) -> Result<()> {
173 let mut c_message: heapless::CString<{ ffi::CFE_MISSION_EVS_MAX_MESSAGE_LENGTH as usize }> =
174 heapless::CString::new();
175
176 c_message
177 .extend_from_bytes(message.as_bytes())
178 .map_err(|_| CfsError::ValidationFailure)?;
179
180 let status = unsafe {
181 ffi::CFE_EVS_SendTimedEvent(
182 time.0,
183 event_id,
184 event_type as ffi::CFE_EVS_EventType_Enum_t,
185 "%s\0".as_ptr() as *const libc::c_char,
186 c_message.as_ptr(),
187 )
188 };
189 check(status)?;
190 Ok(())
191}
192
193pub fn reset_filter(event_id: u16) -> Result<()> {
195 check(unsafe { ffi::CFE_EVS_ResetFilter(event_id) })?;
196 Ok(())
197}
198
199pub fn reset_all_filters() -> Result<()> {
201 check(unsafe { ffi::CFE_EVS_ResetAllFilters() })?;
202 Ok(())
203}