1use crate::ffi;
4use crate::status::check;
5use heapless::CString;
6
7pub type Result<T> = core::result::Result<T, CfsError>;
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
14pub enum EvsError {
15 #[error("CFE-EVS: Unknown Filter scheme")]
17 UnknownFilter,
18 #[error("CFE-EVS: Application not registered")]
20 AppNotRegistered,
21 #[error("CFE-EVS: Illegal Application ID")]
23 AppIllegalAppId,
24 #[error("CFE-EVS: Application filter overload")]
26 AppFilterOverload,
27 #[error("CFE-EVS: Reset Area Pointer Failure")]
29 ResetAreaPointer,
30 #[error("CFE-EVS: Event not registered for filtering")]
32 EvtNotRegistered,
33 #[error("CFE-EVS: File write error")]
35 FileWriteError,
36 #[error("CFE-EVS: Invalid parameter in command")]
38 InvalidParameter,
39 #[error("CFE-EVS: Event squelched due to high rate")]
41 AppSquelched,
42 #[error("CFE-EVS: Not Implemented")]
44 NotImplemented,
45}
46
47#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
49pub enum EsError {
50 #[error("CFE-ES: Resource ID is not valid")]
52 ResourceIdNotValid,
53 #[error("CFE-ES: Resource Name not found")]
55 NameNotFound,
56 #[error("CFE-ES: Application Create Error")]
58 AppCreate,
59 #[error("CFE-ES: Child Task Create Error")]
61 ChildTaskCreate,
62 #[error("CFE-ES: System Log Full")]
64 SysLogFull,
65 #[error("CFE-ES: Memory Block Size Error")]
67 MemBlockSize,
68 #[error("CFE-ES: Load Library Error")]
70 LoadLib,
71 #[error("CFE-ES: Bad Argument")]
73 BadArgument,
74 #[error("CFE-ES: Child Task Register Error")]
76 ChildTaskRegister,
77 #[error("CFE-ES: CDS Insufficient Memory")]
79 CdsInsufficientMemory,
80 #[error("CFE-ES: CDS Invalid Name")]
82 CdsInvalidName,
83 #[error("CFE-ES: CDS Invalid Size")]
85 CdsInvalidSize,
86 #[error("CFE-ES: CDS Invalid")]
88 CdsInvalid,
89 #[error("CFE-ES: CDS Access Error")]
91 CdsAccessError,
92 #[error("CFE-ES: File IO Error")]
94 FileIoErr,
95 #[error("CFE-ES: Reset Area Access Error")]
97 RstAccessErr,
98 #[error("CFE-ES: Application Register Error")]
100 AppRegister,
101 #[error("CFE-ES: Child Task Delete Error")]
103 ChildTaskDelete,
104 #[error("CFE-ES: Attempted to delete a main task")]
107 ChildTaskDeleteMainTask,
108 #[error("CFE-ES: CDS Block CRC Error")]
110 CdsBlockCrcErr,
111 #[error("CFE-ES: Mutex Semaphore Delete Error")]
113 MutSemDeleteErr,
114 #[error("CFE-ES: Binary Semaphore Delete Error")]
116 BinSemDeleteErr,
117 #[error("CFE-ES: Counting Semaphore Delete Error")]
119 CountSemDeleteErr,
120 #[error("CFE-ES: Queue Delete Error")]
122 QueueDeleteErr,
123 #[error("CFE-ES: File Close Error")]
125 FileCloseErr,
126 #[error("CFE-ES: CDS Wrong Type Error")]
128 CdsWrongTypeErr,
129 #[error("CFE-ES: CDS Owner Active Error")]
131 CdsOwnerActiveErr,
132 #[error("CFE-ES: Application Cleanup Error")]
134 AppCleanupErr,
135 #[error("CFE-ES: Timer Delete Error")]
137 TimerDeleteErr,
138 #[error("CFE-ES: Buffer Not In Pool")]
140 BufferNotInPool,
141 #[error("CFE-ES: Task Delete Error")]
143 TaskDeleteErr,
144 #[error("CFE-ES: Operation Timed Out")]
146 OperationTimedOut,
147 #[error("CFE-ES: No Resource IDs Available")]
149 NoResourceIdsAvailable,
150 #[error("CFE-ES: Invalid pool block")]
152 PoolBlockInvalid,
153 #[error("CFE-ES: Duplicate Name Error")]
155 DuplicateName,
156 #[error("CFE-ES: Not Implemented")]
158 NotImplemented,
159}
160
161#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
163pub enum SbError {
164 #[error("CFE-SB: Time Out")]
166 TimeOut,
167 #[error("CFE-SB: No Message")]
169 NoMessage,
170 #[error("CFE-SB: Bad Argument")]
172 BadArgument,
173 #[error("CFE-SB: Max Pipes Met")]
175 MaxPipesMet,
176 #[error("CFE-SB: Pipe Create Error")]
178 PipeCrErr,
179 #[error("CFE-SB: Pipe Read Error")]
181 PipeRdErr,
182 #[error("CFE-SB: Message Too Big")]
184 MsgTooBig,
185 #[error("CFE-SB: Buffer Allocation Error")]
187 BufAllocErr,
188 #[error("CFE-SB: Max Messages Met")]
190 MaxMsgsMet,
191 #[error("CFE-SB: Max Destinations Met")]
193 MaxDestsMet,
194 #[error("CFE-SB: CFE-Internal Error")]
196 InternalErr,
197 #[error("CFE-SB: Wrong Message Type")]
199 WrongMsgType,
200 #[error("CFE-SB: Buffer Invalid")]
202 BufferInvalid,
203 #[error("CFE-SB: Not Implemented")]
205 NotImplemented,
206}
207
208#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
210pub enum FsError {
211 #[error("CFE-FS: Bad Argument")]
213 BadArgument,
214 #[error("CFE-FS: Invalid Path")]
216 InvalidPath,
217 #[error("CFE-FS: Filename Too Long")]
219 FnameTooLong,
220 #[error("CFE-FS: Not Implemented")]
222 NotImplemented,
223}
224
225#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
227pub enum TblError {
228 #[error("CFE-TBL: Invalid Handle")]
230 InvalidHandle,
231 #[error("CFE-TBL: Invalid Name")]
233 InvalidName,
234 #[error("CFE-TBL: Invalid Size")]
236 InvalidSize,
237 #[error("CFE-TBL: Never Loaded")]
239 NeverLoaded,
240 #[error("CFE-TBL: Registry Full")]
242 RegistryFull,
243 #[error("CFE-TBL: No Access")]
245 NoAccess,
246 #[error("CFE-TBL: Unregistered")]
248 Unregistered,
249 #[error("CFE-TBL: Handles Full")]
251 HandlesFull,
252 #[error("CFE-TBL: Duplicate Table With Different Size")]
254 DuplicateDiffSize,
255 #[error("CFE-TBL: Duplicate Table And Not Owned")]
258 DuplicateNotOwned,
259 #[error("CFE-TBL: No Buffer Available")]
261 NoBufferAvail,
262 #[error("CFE-TBL: Dump Only Error")]
264 DumpOnly,
265 #[error("CFE-TBL: Illegal Source Type")]
267 IllegalSrcType,
268 #[error("CFE-TBL: Load In Progress")]
270 LoadInProgress,
271 #[error("CFE-TBL: File Too Large")]
273 FileTooLarge,
274 #[error("CFE-TBL: Bad Content ID")]
276 BadContentId,
277 #[error("CFE-TBL: Bad Subtype ID")]
279 BadSubtypeId,
280 #[error("CFE-TBL: File Size Inconsistent")]
282 FileSizeInconsistent,
283 #[error("CFE-TBL: No Standard Header")]
285 NoStdHeader,
286 #[error("CFE-TBL: No Table Header")]
288 NoTblHeader,
289 #[error("CFE-TBL: Filename Too Long")]
291 FilenameTooLong,
292 #[error("CFE-TBL: File For Wrong Table")]
294 FileForWrongTable,
295 #[error("CFE-TBL: Load Incomplete")]
297 LoadIncomplete,
298 #[error("CFE-TBL: Partial Load Error")]
300 PartialLoad,
301 #[error("CFE-TBL: Invalid Options")]
303 InvalidOptions,
304 #[error("CFE-TBL: Bad Spacecraft ID")]
306 BadSpacecraftId,
307 #[error("CFE-TBL: Bad Processor ID")]
309 BadProcessorId,
310 #[error("CFE-TBL: Message Error")]
312 MessageError,
313 #[error("CFE-TBL: Short File")]
315 ShortFile,
316 #[error("CFE-TBL: Access error")]
318 Access,
319 #[error("CFE-TBL: Bad Argument")]
321 BadArgument,
322 #[error("CFE-TBL: Not Implemented")]
324 NotImplemented,
325}
326
327#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
329pub enum TimeError {
330 #[error("CFE-TIME: Not Implemented")]
332 NotImplemented,
333 #[error("CFE-TIME: Internal Only")]
335 InternalOnly,
336 #[error("CFE-TIME: Out Of Range")]
338 OutOfRange,
339 #[error("CFE-TIME: Too Many Sync Callbacks")]
342 TooManySynchCallbacks,
343 #[error("CFE-TIME: Callback Not Registered")]
345 CallbackNotRegistered,
346 #[error("CFE-TIME: Bad Argument")]
348 BadArgument,
349}
350
351#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
353pub enum OsalError {
354 #[error("OSAL: Generic error")]
356 Error,
357 #[error("OSAL: Invalid pointer")]
359 InvalidPointer,
360 #[error("OSAL: Address misalignment")]
362 AddressMisaligned,
363 #[error("OSAL: Timeout")]
365 Timeout,
366 #[error("OSAL: Invalid Interrupt number")]
368 InvalidIntNum,
369 #[error("OSAL: Semaphore failure")]
371 SemFailure,
372 #[error("OSAL: Semaphore timeout")]
374 SemTimeout,
375 #[error("OSAL: Queue empty")]
377 QueueEmpty,
378 #[error("OSAL: Queue full")]
380 QueueFull,
381 #[error("OSAL: Queue timeout")]
383 QueueTimeout,
384 #[error("OSAL: Queue invalid size")]
386 QueueInvalidSize,
387 #[error("OSAL: Queue ID error")]
389 QueueIdError,
390 #[error("OSAL: Name length too long")]
392 NameTooLong,
393 #[error("OSAL: No free IDs")]
395 NoFreeIds,
396 #[error("OSAL: Name taken")]
398 NameTaken,
399 #[error("OSAL: Invalid ID")]
401 InvalidId,
402 #[error("OSAL: Name not found")]
404 NameNotFound,
405 #[error("OSAL: Semaphore not full")]
407 SemNotFull,
408 #[error("OSAL: Invalid priority")]
410 InvalidPriority,
411 #[error("OSAL: Invalid semaphore value")]
413 InvalidSemValue,
414 #[error("OSAL: File error")]
416 File,
417 #[error("OSAL: Not implemented")]
419 NotImplemented,
420 #[error("OSAL: Timer invalid arguments")]
422 TimerInvalidArgs,
423 #[error("OSAL: Timer ID error")]
425 TimerIdError,
426 #[error("OSAL: Timer unavailable")]
428 TimerUnavailable,
429 #[error("OSAL: Timer internal error")]
431 TimerInternal,
432 #[error("OSAL: Object in use")]
434 ObjectInUse,
435 #[error("OSAL: Bad address")]
437 BadAddress,
438 #[error("OSAL: Incorrect object state")]
441 IncorrectObjState,
442 #[error("OSAL: Incorrect object type")]
445 IncorrectObjType,
446 #[error("OSAL: Stream disconnected")]
448 StreamDisconnected,
449 #[error("OSAL: Requested operation not supported on supplied object(s)")]
452 OperationNotSupported,
453 #[error("OSAL: Invalid Size")]
455 InvalidSize,
456 #[error("OSAL: Size of output exceeds limit")]
458 OutputTooLarge,
459 #[error("OSAL: Invalid argument value")]
461 InvalidArgument,
462 #[error("OSAL: FS path too long")]
464 FsPathTooLong,
465 #[error("OSAL: FS name too long")]
467 FsNameTooLong,
468 #[error("OSAL: FS drive not created")]
470 FsDriveNotCreated,
471 #[error("OSAL: FS device not free")]
473 FsDeviceNotFree,
474 #[error("OSAL: FS path invalid")]
476 FsPathInvalid,
477}
478
479#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
484#[non_exhaustive]
485pub enum CfsError {
486 #[error(transparent)]
488 Evs(#[from] EvsError),
489 #[error(transparent)]
491 Es(#[from] EsError),
492 #[error(transparent)]
494 Sb(#[from] SbError),
495 #[error(transparent)]
497 Fs(#[from] FsError),
498 #[error(transparent)]
500 Tbl(#[from] TblError),
501 #[error(transparent)]
503 Time(#[from] TimeError),
504 #[error(transparent)]
506 Osal(#[from] OsalError),
507
508 #[cfg(feature = "nos3")]
510 #[error(transparent)]
511 Bus(#[from] crate::nos3::buses::BusError),
512
513 #[error("CFE: Wrong Message Length")]
516 WrongMsgLength,
517 #[error("CFE: Unknown Message ID")]
519 UnknownMsgId,
520 #[error("CFE: Bad Command Code")]
522 BadCommandCode,
523 #[error("CFE: External resource failure")]
525 ExternalResourceFail,
526 #[error("CFE: Request already pending")]
528 RequestAlreadyPending,
529 #[error("CFE: Validation Failure")]
531 ValidationFailure,
532 #[error("CFE: Input value out of range")]
534 RangeError,
535 #[error("CFE: Cannot process request in current state")]
537 IncorrectState,
538 #[error("CFE: Not Implemented")]
540 NotImplemented,
541 #[error("Invalid string: contains interior null character")]
544 InvalidString,
545 #[error("The task pool is full")]
547 TaskPoolFull,
548 #[error("The task's stack size exceeds the maximum allowed size")]
550 TaskTooLarge,
551 #[error("The task's alignment requirement exceeds the maximum allowed alignment")]
553 TaskAlignmentTooLarge,
554 #[error("Type conversion error")]
556 ConversionError(&'static str),
557 #[error("Unhandled error code: {0}")]
559 Unhandled(i32),
560}
561
562impl From<ffi::CFE_Status_t> for CfsError {
565 fn from(status: ffi::CFE_Status_t) -> Self {
566 match status {
567 ffi::CFE_STATUS_WRONG_MSG_LENGTH => CfsError::WrongMsgLength,
569 ffi::CFE_STATUS_UNKNOWN_MSG_ID => CfsError::UnknownMsgId,
570 ffi::CFE_STATUS_BAD_COMMAND_CODE => CfsError::BadCommandCode,
571 ffi::CFE_STATUS_EXTERNAL_RESOURCE_FAIL => CfsError::ExternalResourceFail,
572 ffi::CFE_STATUS_REQUEST_ALREADY_PENDING => CfsError::RequestAlreadyPending,
573 ffi::CFE_STATUS_VALIDATION_FAILURE => CfsError::ValidationFailure,
574 ffi::CFE_STATUS_RANGE_ERROR => CfsError::RangeError,
575 ffi::CFE_STATUS_INCORRECT_STATE => CfsError::IncorrectState,
576 ffi::CFE_STATUS_NOT_IMPLEMENTED => CfsError::NotImplemented,
577
578 ffi::CFE_EVS_UNKNOWN_FILTER => EvsError::UnknownFilter.into(),
580 ffi::CFE_EVS_APP_NOT_REGISTERED => EvsError::AppNotRegistered.into(),
581 ffi::CFE_EVS_APP_ILLEGAL_APP_ID => EvsError::AppIllegalAppId.into(),
582 ffi::CFE_EVS_APP_FILTER_OVERLOAD => EvsError::AppFilterOverload.into(),
583 ffi::CFE_EVS_RESET_AREA_POINTER => EvsError::ResetAreaPointer.into(),
584 ffi::CFE_EVS_EVT_NOT_REGISTERED => EvsError::EvtNotRegistered.into(),
585 ffi::CFE_EVS_FILE_WRITE_ERROR => EvsError::FileWriteError.into(),
586 ffi::CFE_EVS_INVALID_PARAMETER => EvsError::InvalidParameter.into(),
587 ffi::CFE_EVS_APP_SQUELCHED => EvsError::AppSquelched.into(),
588 ffi::CFE_EVS_NOT_IMPLEMENTED => EvsError::NotImplemented.into(),
589
590 ffi::CFE_ES_ERR_RESOURCEID_NOT_VALID => EsError::ResourceIdNotValid.into(),
592 ffi::CFE_ES_ERR_NAME_NOT_FOUND => EsError::NameNotFound.into(),
593 ffi::CFE_ES_ERR_APP_CREATE => EsError::AppCreate.into(),
594 ffi::CFE_ES_ERR_CHILD_TASK_CREATE => EsError::ChildTaskCreate.into(),
595 ffi::CFE_ES_ERR_SYS_LOG_FULL => EsError::SysLogFull.into(),
596 ffi::CFE_ES_ERR_MEM_BLOCK_SIZE => EsError::MemBlockSize.into(),
597 ffi::CFE_ES_ERR_LOAD_LIB => EsError::LoadLib.into(),
598 ffi::CFE_ES_BAD_ARGUMENT => EsError::BadArgument.into(),
599 ffi::CFE_ES_ERR_CHILD_TASK_REGISTER => EsError::ChildTaskRegister.into(),
600 ffi::CFE_ES_CDS_INSUFFICIENT_MEMORY => EsError::CdsInsufficientMemory.into(),
601 ffi::CFE_ES_CDS_INVALID_NAME => EsError::CdsInvalidName.into(),
602 ffi::CFE_ES_CDS_INVALID_SIZE => EsError::CdsInvalidSize.into(),
603 ffi::CFE_ES_CDS_INVALID => EsError::CdsInvalid.into(),
604 ffi::CFE_ES_CDS_ACCESS_ERROR => EsError::CdsAccessError.into(),
605 ffi::CFE_ES_FILE_IO_ERR => EsError::FileIoErr.into(),
606 ffi::CFE_ES_RST_ACCESS_ERR => EsError::RstAccessErr.into(),
607 ffi::CFE_ES_ERR_APP_REGISTER => EsError::AppRegister.into(),
608 ffi::CFE_ES_ERR_CHILD_TASK_DELETE => EsError::ChildTaskDelete.into(),
609 ffi::CFE_ES_ERR_CHILD_TASK_DELETE_MAIN_TASK => EsError::ChildTaskDeleteMainTask.into(),
610 ffi::CFE_ES_CDS_BLOCK_CRC_ERR => EsError::CdsBlockCrcErr.into(),
611 ffi::CFE_ES_MUT_SEM_DELETE_ERR => EsError::MutSemDeleteErr.into(),
612 ffi::CFE_ES_BIN_SEM_DELETE_ERR => EsError::BinSemDeleteErr.into(),
613 ffi::CFE_ES_COUNT_SEM_DELETE_ERR => EsError::CountSemDeleteErr.into(),
614 ffi::CFE_ES_QUEUE_DELETE_ERR => EsError::QueueDeleteErr.into(),
615 ffi::CFE_ES_FILE_CLOSE_ERR => EsError::FileCloseErr.into(),
616 ffi::CFE_ES_CDS_WRONG_TYPE_ERR => EsError::CdsWrongTypeErr.into(),
617 ffi::CFE_ES_CDS_OWNER_ACTIVE_ERR => EsError::CdsOwnerActiveErr.into(),
618 ffi::CFE_ES_APP_CLEANUP_ERR => EsError::AppCleanupErr.into(),
619 ffi::CFE_ES_TIMER_DELETE_ERR => EsError::TimerDeleteErr.into(),
620 ffi::CFE_ES_BUFFER_NOT_IN_POOL => EsError::BufferNotInPool.into(),
621 ffi::CFE_ES_TASK_DELETE_ERR => EsError::TaskDeleteErr.into(),
622 ffi::CFE_ES_OPERATION_TIMED_OUT => EsError::OperationTimedOut.into(),
623 ffi::CFE_ES_NO_RESOURCE_IDS_AVAILABLE => EsError::NoResourceIdsAvailable.into(),
624 ffi::CFE_ES_POOL_BLOCK_INVALID => EsError::PoolBlockInvalid.into(),
625 ffi::CFE_ES_ERR_DUPLICATE_NAME => EsError::DuplicateName.into(),
626 ffi::CFE_ES_NOT_IMPLEMENTED => EsError::NotImplemented.into(),
627
628 ffi::CFE_FS_BAD_ARGUMENT => FsError::BadArgument.into(),
630 ffi::CFE_FS_INVALID_PATH => FsError::InvalidPath.into(),
631 ffi::CFE_FS_FNAME_TOO_LONG => FsError::FnameTooLong.into(),
632 ffi::CFE_FS_NOT_IMPLEMENTED => FsError::NotImplemented.into(),
633
634 ffi::CFE_SB_TIME_OUT => SbError::TimeOut.into(),
636 ffi::CFE_SB_NO_MESSAGE => SbError::NoMessage.into(),
637 ffi::CFE_SB_BAD_ARGUMENT => SbError::BadArgument.into(),
638 ffi::CFE_SB_MAX_PIPES_MET => SbError::MaxPipesMet.into(),
639 ffi::CFE_SB_PIPE_CR_ERR => SbError::PipeCrErr.into(),
640 ffi::CFE_SB_PIPE_RD_ERR => SbError::PipeRdErr.into(),
641 ffi::CFE_SB_MSG_TOO_BIG => SbError::MsgTooBig.into(),
642 ffi::CFE_SB_BUF_ALOC_ERR => SbError::BufAllocErr.into(),
643 ffi::CFE_SB_MAX_MSGS_MET => SbError::MaxMsgsMet.into(),
644 ffi::CFE_SB_MAX_DESTS_MET => SbError::MaxDestsMet.into(),
645 ffi::CFE_SB_INTERNAL_ERR => SbError::InternalErr.into(),
646 ffi::CFE_SB_WRONG_MSG_TYPE => SbError::WrongMsgType.into(),
647 ffi::CFE_SB_BUFFER_INVALID => SbError::BufferInvalid.into(),
648 ffi::CFE_SB_NOT_IMPLEMENTED => SbError::NotImplemented.into(),
649
650 ffi::CFE_TBL_ERR_INVALID_HANDLE => TblError::InvalidHandle.into(),
652 ffi::CFE_TBL_ERR_INVALID_NAME => TblError::InvalidName.into(),
653 ffi::CFE_TBL_ERR_INVALID_SIZE => TblError::InvalidSize.into(),
654 ffi::CFE_TBL_ERR_NEVER_LOADED => TblError::NeverLoaded.into(),
655 ffi::CFE_TBL_ERR_REGISTRY_FULL => TblError::RegistryFull.into(),
656 ffi::CFE_TBL_ERR_NO_ACCESS => TblError::NoAccess.into(),
657 ffi::CFE_TBL_ERR_UNREGISTERED => TblError::Unregistered.into(),
658 ffi::CFE_TBL_ERR_HANDLES_FULL => TblError::HandlesFull.into(),
659 ffi::CFE_TBL_ERR_DUPLICATE_DIFF_SIZE => TblError::DuplicateDiffSize.into(),
660 ffi::CFE_TBL_ERR_DUPLICATE_NOT_OWNED => TblError::DuplicateNotOwned.into(),
661 ffi::CFE_TBL_ERR_NO_BUFFER_AVAIL => TblError::NoBufferAvail.into(),
662 ffi::CFE_TBL_ERR_DUMP_ONLY => TblError::DumpOnly.into(),
663 ffi::CFE_TBL_ERR_ILLEGAL_SRC_TYPE => TblError::IllegalSrcType.into(),
664 ffi::CFE_TBL_ERR_LOAD_IN_PROGRESS => TblError::LoadInProgress.into(),
665 ffi::CFE_TBL_ERR_FILE_TOO_LARGE => TblError::FileTooLarge.into(),
666 ffi::CFE_TBL_ERR_BAD_CONTENT_ID => TblError::BadContentId.into(),
667 ffi::CFE_TBL_ERR_BAD_SUBTYPE_ID => TblError::BadSubtypeId.into(),
668 ffi::CFE_TBL_ERR_FILE_SIZE_INCONSISTENT => TblError::FileSizeInconsistent.into(),
669 ffi::CFE_TBL_ERR_NO_STD_HEADER => TblError::NoStdHeader.into(),
670 ffi::CFE_TBL_ERR_NO_TBL_HEADER => TblError::NoTblHeader.into(),
671 ffi::CFE_TBL_ERR_FILENAME_TOO_LONG => TblError::FilenameTooLong.into(),
672 ffi::CFE_TBL_ERR_FILE_FOR_WRONG_TABLE => TblError::FileForWrongTable.into(),
673 ffi::CFE_TBL_ERR_LOAD_INCOMPLETE => TblError::LoadIncomplete.into(),
674 ffi::CFE_TBL_ERR_PARTIAL_LOAD => TblError::PartialLoad.into(),
675 ffi::CFE_TBL_ERR_INVALID_OPTIONS => TblError::InvalidOptions.into(),
676 ffi::CFE_TBL_ERR_BAD_SPACECRAFT_ID => TblError::BadSpacecraftId.into(),
677 ffi::CFE_TBL_ERR_BAD_PROCESSOR_ID => TblError::BadProcessorId.into(),
678 ffi::CFE_TBL_MESSAGE_ERROR => TblError::MessageError.into(),
679 ffi::CFE_TBL_ERR_SHORT_FILE => TblError::ShortFile.into(),
680 ffi::CFE_TBL_ERR_ACCESS => TblError::Access.into(),
681 ffi::CFE_TBL_BAD_ARGUMENT => TblError::BadArgument.into(),
682 ffi::CFE_TBL_NOT_IMPLEMENTED => TblError::NotImplemented.into(),
683
684 ffi::CFE_TIME_NOT_IMPLEMENTED => TimeError::NotImplemented.into(),
686 ffi::CFE_TIME_INTERNAL_ONLY => TimeError::InternalOnly.into(),
687 ffi::CFE_TIME_OUT_OF_RANGE => TimeError::OutOfRange.into(),
688 ffi::CFE_TIME_TOO_MANY_SYNCH_CALLBACKS => TimeError::TooManySynchCallbacks.into(),
689 ffi::CFE_TIME_CALLBACK_NOT_REGISTERED => TimeError::CallbackNotRegistered.into(),
690 ffi::CFE_TIME_BAD_ARGUMENT => TimeError::BadArgument.into(),
691
692 ffi::OS_ERROR => OsalError::Error.into(),
694 ffi::OS_INVALID_POINTER => OsalError::InvalidPointer.into(),
695 ffi::OS_ERROR_ADDRESS_MISALIGNED => OsalError::AddressMisaligned.into(),
696 ffi::OS_ERROR_TIMEOUT => OsalError::Timeout.into(),
697 ffi::OS_INVALID_INT_NUM => OsalError::InvalidIntNum.into(),
698 ffi::OS_SEM_FAILURE => OsalError::SemFailure.into(),
699 ffi::OS_SEM_TIMEOUT => OsalError::SemTimeout.into(),
700 ffi::OS_QUEUE_EMPTY => OsalError::QueueEmpty.into(),
701 ffi::OS_QUEUE_FULL => OsalError::QueueFull.into(),
702 ffi::OS_QUEUE_TIMEOUT => OsalError::QueueTimeout.into(),
703 ffi::OS_QUEUE_INVALID_SIZE => OsalError::QueueInvalidSize.into(),
704 ffi::OS_QUEUE_ID_ERROR => OsalError::QueueIdError.into(),
705 ffi::OS_ERR_NAME_TOO_LONG => OsalError::NameTooLong.into(),
706 ffi::OS_ERR_NO_FREE_IDS => OsalError::NoFreeIds.into(),
707 ffi::OS_ERR_NAME_TAKEN => OsalError::NameTaken.into(),
708 ffi::OS_ERR_INVALID_ID => OsalError::InvalidId.into(),
709 ffi::OS_ERR_NAME_NOT_FOUND => OsalError::NameNotFound.into(),
710 ffi::OS_ERR_SEM_NOT_FULL => OsalError::SemNotFull.into(),
711 ffi::OS_ERR_INVALID_PRIORITY => OsalError::InvalidPriority.into(),
712 ffi::OS_INVALID_SEM_VALUE => OsalError::InvalidSemValue.into(),
713 ffi::OS_ERR_FILE => OsalError::File.into(),
714 ffi::OS_ERR_NOT_IMPLEMENTED => OsalError::NotImplemented.into(),
715 ffi::OS_TIMER_ERR_INVALID_ARGS => OsalError::TimerInvalidArgs.into(),
716 ffi::OS_TIMER_ERR_TIMER_ID => OsalError::TimerIdError.into(),
717 ffi::OS_TIMER_ERR_UNAVAILABLE => OsalError::TimerUnavailable.into(),
718 ffi::OS_TIMER_ERR_INTERNAL => OsalError::TimerInternal.into(),
719 ffi::OS_ERR_OBJECT_IN_USE => OsalError::ObjectInUse.into(),
720 ffi::OS_ERR_BAD_ADDRESS => OsalError::BadAddress.into(),
721 ffi::OS_ERR_INCORRECT_OBJ_STATE => OsalError::IncorrectObjState.into(),
722 ffi::OS_ERR_INCORRECT_OBJ_TYPE => OsalError::IncorrectObjType.into(),
723 ffi::OS_ERR_STREAM_DISCONNECTED => OsalError::StreamDisconnected.into(),
724 ffi::OS_ERR_OPERATION_NOT_SUPPORTED => OsalError::OperationNotSupported.into(),
725 ffi::OS_ERR_INVALID_SIZE => OsalError::InvalidSize.into(),
726 ffi::OS_ERR_OUTPUT_TOO_LARGE => OsalError::OutputTooLarge.into(),
727 ffi::OS_ERR_INVALID_ARGUMENT => OsalError::InvalidArgument.into(),
728 ffi::OS_FS_ERR_PATH_TOO_LONG => OsalError::FsPathTooLong.into(),
729 ffi::OS_FS_ERR_NAME_TOO_LONG => OsalError::FsNameTooLong.into(),
730 ffi::OS_FS_ERR_DRIVE_NOT_CREATED => OsalError::FsDriveNotCreated.into(),
731 ffi::OS_FS_ERR_DEVICE_NOT_FREE => OsalError::FsDeviceNotFree.into(),
732 ffi::OS_FS_ERR_PATH_INVALID => OsalError::FsPathInvalid.into(),
733
734 other => CfsError::Unhandled(other),
735 }
736 }
737}
738
739impl CfsError {
742 pub fn name(error: i32) -> Result<CString<{ ffi::OS_ERROR_NAME_LENGTH as usize }>> {
744 const SIZE: usize = ffi::OS_ERROR_NAME_LENGTH as usize;
745 let mut name_buf = [0 as libc::c_char; SIZE];
746 check(unsafe { ffi::OS_GetErrorName(error, &mut name_buf) })?;
747
748 let c_str = unsafe { core::ffi::CStr::from_ptr(name_buf.as_ptr()) };
749 let mut s = CString::new();
750 s.extend_from_bytes(c_str.to_bytes())
751 .map_err(|_| CfsError::Osal(OsalError::NameTooLong))?;
752 Ok(s)
753 }
754}
755
756pub fn get_cfe_status_name(
758 status: i32,
759) -> Result<CString<{ ffi::CFE_STATUS_STRING_LENGTH as usize }>> {
760 const SIZE: usize = ffi::CFE_STATUS_STRING_LENGTH as usize;
761 let mut name_buf = [0 as libc::c_char; SIZE];
762 unsafe { ffi::CFE_ES_StatusToString(status, &mut name_buf) };
763
764 let c_str = unsafe { core::ffi::CStr::from_ptr(name_buf.as_ptr()) };
765 let mut s = CString::new();
766 s.extend_from_bytes(c_str.to_bytes())
767 .map_err(|_| CfsError::Osal(OsalError::NameTooLong))?;
768 Ok(s)
769}
770
771pub fn osal_status_to_string(
774 status: i32,
775) -> Result<CString<{ ffi::OS_STATUS_STRING_LENGTH as usize }>> {
776 const SIZE: usize = ffi::OS_STATUS_STRING_LENGTH as usize;
777 let mut name_buf = [0 as libc::c_char; SIZE];
778 unsafe { ffi::OS_StatusToString(status, &mut name_buf) };
779
780 let c_str = unsafe { core::ffi::CStr::from_ptr(name_buf.as_ptr()) };
781 let mut s = CString::new();
782 s.extend_from_bytes(c_str.to_bytes())
783 .map_err(|_| CfsError::Osal(OsalError::NameTooLong))?;
784 Ok(s)
785}