From 5d93e17c17bba17848fe0fbc6e39702acb0d6fce Mon Sep 17 00:00:00 2001 From: Van Date: Fri, 11 Aug 2023 10:37:13 -0400 Subject: [PATCH] Fix #393, find standard psp module by name Fix #393, update cfe_psp_module_findbyname and ...getAPIEntry to search internal module list. --- fsw/shared/src/cfe_psp_module.c | 45 ++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/fsw/shared/src/cfe_psp_module.c b/fsw/shared/src/cfe_psp_module.c index 0121b143..71732019 100644 --- a/fsw/shared/src/cfe_psp_module.c +++ b/fsw/shared/src/cfe_psp_module.c @@ -52,6 +52,7 @@ #define CFE_PSP_INTERNAL_MODULE_BASE ((CFE_PSP_MODULE_BASE | CFE_PSP_MODULE_INDEX_MASK) & ~0xFF) static uint32 CFE_PSP_ConfigPspModuleListLength = 0; +static uint32 CFE_PSP_StandardPspModuleListLength = 0; /*************************************************** * @@ -96,10 +97,9 @@ uint32_t CFE_PSP_ModuleInitList(uint32 BaseId, CFE_StaticModuleLoadEntry_t *List void CFE_PSP_ModuleInit(void) { /* First initialize the fixed set of modules for this PSP */ - CFE_PSP_ModuleInitList(CFE_PSP_INTERNAL_MODULE_BASE, CFE_PSP_BASE_MODULE_LIST); + CFE_PSP_StandardPspModuleListLength = CFE_PSP_ModuleInitList(CFE_PSP_INTERNAL_MODULE_BASE, CFE_PSP_BASE_MODULE_LIST); /* Then initialize any user-selected extension modules */ - /* Only these modules can be used with CFE_PSP_Module_GetAPIEntry or CFE_PSP_Module_FindByName */ CFE_PSP_ConfigPspModuleListLength = CFE_PSP_ModuleInitList(CFE_PSP_MODULE_BASE, GLOBAL_CONFIGDATA.PspModuleList); } @@ -115,11 +115,24 @@ int32 CFE_PSP_Module_GetAPIEntry(uint32 PspModuleId, CFE_PSP_ModuleApi_t **API) Result = CFE_PSP_INVALID_MODULE_ID; if ((PspModuleId & ~CFE_PSP_MODULE_INDEX_MASK) == CFE_PSP_MODULE_BASE) { - LocalId = PspModuleId & CFE_PSP_MODULE_INDEX_MASK; - if (LocalId < CFE_PSP_ConfigPspModuleListLength) + /* Last 256 enteries are for internal modules */ + if((PspModuleId & CFE_PSP_MODULE_INDEX_MASK) >= 0xFF00 ) { - *API = (CFE_PSP_ModuleApi_t *)GLOBAL_CONFIGDATA.PspModuleList[LocalId].Api; - Result = CFE_PSP_SUCCESS; + LocalId = PspModuleId & 0xFF; + if (LocalId < CFE_PSP_StandardPspModuleListLength) + { + *API = (CFE_PSP_ModuleApi_t *)CFE_PSP_BASE_MODULE_LIST[LocalId].Api; + Result = CFE_PSP_SUCCESS; + } + } + else + { + LocalId = PspModuleId & CFE_PSP_MODULE_INDEX_MASK; + if (LocalId < CFE_PSP_ConfigPspModuleListLength) + { + *API = (CFE_PSP_ModuleApi_t *)GLOBAL_CONFIGDATA.PspModuleList[LocalId].Api; + Result = CFE_PSP_SUCCESS; + } } } @@ -139,6 +152,8 @@ int32 CFE_PSP_Module_FindByName(const char *ModuleName, uint32 *PspModuleId) Entry = GLOBAL_CONFIGDATA.PspModuleList; Result = CFE_PSP_INVALID_MODULE_NAME; i = 0; + + /* Check global list */ while (i < CFE_PSP_ConfigPspModuleListLength) { if (strcmp(Entry->Name, ModuleName) == 0) @@ -151,5 +166,23 @@ int32 CFE_PSP_Module_FindByName(const char *ModuleName, uint32 *PspModuleId) ++i; } + /* Check internal list */ + if (Result != CFE_PSP_SUCCESS) + { + Entry = CFE_PSP_BASE_MODULE_LIST; + i = 0; + while (i < CFE_PSP_StandardPspModuleListLength) + { + if (strcmp(Entry->Name, ModuleName) == 0) + { + *PspModuleId = CFE_PSP_INTERNAL_MODULE_BASE | (i & CFE_PSP_MODULE_INDEX_MASK); + Result = CFE_PSP_SUCCESS; + break; + } + ++Entry; + ++i; + } + } + return Result; }