Skip to content

Commit e43ef28

Browse files
committed
Fix #28, Provide Library API similar to App API
Allows the existing "CFE_ES_AppInfo_t" structure to be extended to libraries as well as applications by introducing a new value (3) for the Type field. Allows Libraries to be queried via API calls similar to App API. Also extends the Query All/Query One commands to operate on Libraries or Applications.
1 parent fa3aae5 commit e43ef28

File tree

7 files changed

+444
-252
lines changed

7 files changed

+444
-252
lines changed

fsw/cfe-core/src/es/cfe_es_api.c

+210-48
Original file line numberDiff line numberDiff line change
@@ -965,8 +965,10 @@ int32 CFE_ES_GetTaskName(char *TaskName, CFE_ES_ResourceID_t TaskId, uint32 Buff
965965
*/
966966
int32 CFE_ES_GetAppInfo(CFE_ES_AppInfo_t *AppInfo, CFE_ES_ResourceID_t AppId)
967967
{
968-
int32 ReturnCode = CFE_SUCCESS;
969968
CFE_ES_AppRecord_t *AppRecPtr;
969+
CFE_ES_TaskRecord_t *TaskRecPtr;
970+
int32 Status;
971+
uint32 i;
970972

971973
if ( AppInfo == NULL )
972974
{
@@ -976,73 +978,233 @@ int32 CFE_ES_GetAppInfo(CFE_ES_AppInfo_t *AppInfo, CFE_ES_ResourceID_t AppId)
976978

977979
memset(AppInfo, 0, sizeof(*AppInfo));
978980

979-
/*
980-
** Get App Record
981-
*/
982981
AppRecPtr = CFE_ES_LocateAppRecordByID(AppId);
983-
if ( AppRecPtr == NULL )
982+
983+
CFE_ES_LockSharedData(__func__,__LINE__);
984+
985+
if ( !CFE_ES_AppRecordIsMatch(AppRecPtr, AppId) )
984986
{
985-
CFE_ES_WriteToSysLog("CFE_ES_GetAppInfo: App ID Invalid: %lu\n",
987+
/*
988+
* Log a message if called with an invalid ID.
989+
*/
990+
CFE_ES_WriteToSysLog("CFE_ES_GetAppInfo: App ID not active: %lu\n",
986991
CFE_ES_ResourceID_ToInteger(AppId));
987-
return CFE_ES_ERR_RESOURCEID_NOT_VALID;
988-
}
992+
993+
Status = CFE_ES_ERR_RESOURCEID_NOT_VALID;
994+
}
995+
else
996+
{
997+
AppInfo->AppId = AppId;
998+
AppInfo->Type = AppRecPtr->Type;
999+
1000+
CFE_ES_CopyModuleBasicInfo(&AppRecPtr->StartParams.BasicInfo, AppInfo);
1001+
CFE_ES_CopyModuleStatusInfo(&AppRecPtr->ModuleInfo, AppInfo);
1002+
1003+
AppInfo->StackSize = AppRecPtr->StartParams.StackSize;
1004+
AppInfo->ExceptionAction = AppRecPtr->StartParams.ExceptionAction;
1005+
AppInfo->Priority = AppRecPtr->StartParams.Priority;
1006+
AppInfo->MainTaskId = AppRecPtr->MainTaskId;
1007+
1008+
/*
1009+
** Calculate the number of child tasks
1010+
*/
1011+
AppInfo->NumOfChildTasks = 0;
1012+
TaskRecPtr = CFE_ES_Global.TaskTable;
1013+
for (i=0; i<OS_MAX_TASKS; i++ )
1014+
{
1015+
if ( CFE_ES_TaskRecordIsUsed(TaskRecPtr) &&
1016+
CFE_ES_ResourceID_Equal(TaskRecPtr->AppId, AppId))
1017+
{
1018+
if (CFE_ES_ResourceID_Equal(CFE_ES_TaskRecordGetID(TaskRecPtr), AppInfo->MainTaskId))
1019+
{
1020+
/* This is the main task - capture its name and execution count */
1021+
AppInfo->ExecutionCounter = TaskRecPtr->ExecutionCounter;
1022+
strncpy(AppInfo->MainTaskName, TaskRecPtr->TaskName,
1023+
sizeof(AppInfo->MainTaskName) - 1);
1024+
AppInfo->MainTaskName[sizeof(AppInfo->MainTaskName) - 1] = '\0';
1025+
}
1026+
else
1027+
{
1028+
/* This is a child task, no extra info, just increment count */
1029+
++AppInfo->NumOfChildTasks;
1030+
}
1031+
}
1032+
++TaskRecPtr;
1033+
}
1034+
1035+
Status = CFE_SUCCESS;
1036+
}
1037+
1038+
CFE_ES_UnlockSharedData(__func__,__LINE__);
9891039

9901040
/*
991-
* Note - cannot check if the AppID is active here,
992-
* as the table is not locked. The internal function
993-
* should lock and check.
994-
*/
995-
ReturnCode = CFE_ES_GetAppInfoInternal(AppRecPtr, AppInfo);
996-
if (ReturnCode != CFE_SUCCESS)
1041+
** Get the address information from the OSAL
1042+
*/
1043+
if (Status == CFE_SUCCESS)
9971044
{
998-
CFE_ES_WriteToSysLog("CFE_ES_GetAppInfo: App ID Not Active: %lu\n",
999-
CFE_ES_ResourceID_ToInteger(AppId));
1045+
CFE_ES_CopyModuleAddressInfo(AppInfo->ModuleId, AppInfo);
10001046
}
10011047

1002-
return(ReturnCode);
1048+
return Status;
1049+
}
1050+
1051+
/*
1052+
** Function: CFE_ES_GetLibInfo - See API and header file for details
1053+
*/
1054+
int32 CFE_ES_GetLibInfo(CFE_ES_AppInfo_t *LibInfo, CFE_ES_ResourceID_t LibId)
1055+
{
1056+
int32 Status;
1057+
CFE_ES_LibRecord_t *LibRecPtr;
1058+
1059+
if ( LibInfo == NULL )
1060+
{
1061+
CFE_ES_WriteToSysLog("CFE_ES_GetLibInfo: Invalid Parameter ( Null Pointer )\n");
1062+
return CFE_ES_ERR_BUFFER;
1063+
}
1064+
1065+
LibRecPtr = CFE_ES_LocateLibRecordByID(LibId);
1066+
1067+
CFE_ES_LockSharedData(__func__,__LINE__);
1068+
1069+
if ( !CFE_ES_LibRecordIsMatch(LibRecPtr, LibId) )
1070+
{
1071+
/*
1072+
* Log a message if called with an invalid ID.
1073+
*/
1074+
CFE_ES_SysLogWrite_Unsync("CFE_ES_GetLibInfo: Lib ID not active: %lu\n",
1075+
CFE_ES_ResourceID_ToInteger(LibId));
1076+
1077+
Status = CFE_ES_ERR_RESOURCEID_NOT_VALID;
1078+
}
1079+
else
1080+
{
1081+
LibInfo->AppId = CFE_ES_LibRecordGetID(LibRecPtr);;
1082+
LibInfo->Type = CFE_ES_AppType_LIBRARY;
1083+
1084+
CFE_ES_CopyModuleBasicInfo(&LibRecPtr->BasicInfo, LibInfo);
1085+
CFE_ES_CopyModuleStatusInfo(&LibRecPtr->ModuleInfo, LibInfo);
1086+
1087+
Status = CFE_SUCCESS;
1088+
}
1089+
1090+
CFE_ES_UnlockSharedData(__func__,__LINE__);
1091+
1092+
/*
1093+
** Get the address information from the OSAL
1094+
*/
1095+
if (Status == CFE_SUCCESS)
1096+
{
1097+
CFE_ES_CopyModuleAddressInfo(LibInfo->ModuleId, LibInfo);
1098+
}
1099+
1100+
return Status;
1101+
}
1102+
1103+
/*
1104+
** Function: CFE_ES_GetModuleInfo - See API and header file for details
1105+
*/
1106+
int32 CFE_ES_GetModuleInfo(CFE_ES_AppInfo_t *ModuleInfo, CFE_ES_ResourceID_t ResourceId)
1107+
{
1108+
uint32 ResourceType;
1109+
int32 Status;
1110+
1111+
ResourceType = CFE_ES_ResourceID_ToInteger(ResourceId);
1112+
ResourceType -= ResourceType & CFE_ES_RESOURCEID_MAX;
1113+
switch(ResourceType)
1114+
{
1115+
case CFE_ES_APPID_BASE:
1116+
Status = CFE_ES_GetAppInfo(ModuleInfo, ResourceId);
1117+
break;
1118+
case CFE_ES_LIBID_BASE:
1119+
Status = CFE_ES_GetLibInfo(ModuleInfo, ResourceId);
1120+
break;
1121+
default:
1122+
/*
1123+
* Log a message if called with an invalid ID.
1124+
*/
1125+
CFE_ES_WriteToSysLog("CFE_ES_GetModuleInfo: Resource ID not valid: %lu\n",
1126+
CFE_ES_ResourceID_ToInteger(ResourceId));
1127+
Status = CFE_ES_ERR_RESOURCEID_NOT_VALID;
1128+
break;
1129+
1130+
}
1131+
1132+
return(Status);
10031133

1004-
} /* End of CFE_ES_GetAppInfo() */
1134+
} /* End of CFE_ES_GetModuleInfo() */
10051135

10061136
/*
10071137
** Function: CFE_ES_GetTaskInfo - See API and header file for details
10081138
*/
10091139
int32 CFE_ES_GetTaskInfo(CFE_ES_TaskInfo_t *TaskInfo, CFE_ES_ResourceID_t TaskId)
10101140
{
1011-
CFE_ES_TaskRecord_t *TaskRecPtr;
1012-
int32 ReturnCode;
1141+
CFE_ES_TaskRecord_t *TaskRecPtr;
1142+
CFE_ES_AppRecord_t *AppRecPtr;
1143+
int32 Status;
10131144

1014-
if ( TaskInfo == NULL )
1015-
{
1016-
CFE_ES_WriteToSysLog("CFE_ES_GetTaskInfo: Invalid Parameter ( Null Pointer )\n");
1017-
return CFE_ES_ERR_BUFFER;
1018-
}
1145+
if ( TaskInfo == NULL )
1146+
{
1147+
CFE_ES_WriteToSysLog("CFE_ES_GetTaskInfo: Invalid Parameter ( Null Pointer )\n");
1148+
return CFE_ES_ERR_BUFFER;
1149+
}
10191150

1020-
memset(TaskInfo, 0, sizeof(*TaskInfo));
1151+
memset(TaskInfo, 0, sizeof(*TaskInfo));
10211152

1022-
/*
1023-
** Get Task Record
1024-
*/
1025-
TaskRecPtr = CFE_ES_LocateTaskRecordByID(TaskId);
1026-
if ( TaskRecPtr == NULL )
1027-
{
1028-
CFE_ES_WriteToSysLog("CFE_ES_GetTaskInfo: Task ID Not Valid: %lu\n",
1029-
CFE_ES_ResourceID_ToInteger(TaskId));
1030-
return CFE_ES_ERR_RESOURCEID_NOT_VALID;
1031-
}
1153+
TaskRecPtr = CFE_ES_LocateTaskRecordByID(TaskId);
10321154

1033-
/*
1034-
* Note - cannot check if the TaskID is active here,
1035-
* as the table is not locked. The internal function
1036-
* should lock and check.
1037-
*/
1038-
ReturnCode = CFE_ES_GetTaskInfoInternal(TaskRecPtr, TaskInfo);
1039-
if (ReturnCode != CFE_SUCCESS)
1040-
{
1041-
CFE_ES_WriteToSysLog("CFE_ES_GetTaskInfo: Task ID Not Active: %lu\n",
1042-
CFE_ES_ResourceID_ToInteger(TaskId));
1043-
}
1155+
CFE_ES_LockSharedData(__func__,__LINE__);
10441156

1045-
return(ReturnCode);
1157+
if ( !CFE_ES_TaskRecordIsMatch(TaskRecPtr, TaskId) )
1158+
{
1159+
/* task ID is bad */
1160+
Status = CFE_ES_ERR_RESOURCEID_NOT_VALID;
1161+
CFE_ES_SysLogWrite_Unsync("CFE_ES_GetTaskInfo: Task ID Not Active: %lu\n",
1162+
CFE_ES_ResourceID_ToInteger(TaskId));
1163+
}
1164+
else
1165+
{
1166+
1167+
/*
1168+
** Get the Application ID and Task Name
1169+
*/
1170+
TaskInfo->AppId = TaskRecPtr->AppId;
1171+
strncpy(TaskInfo->TaskName,
1172+
CFE_ES_TaskRecordGetName(TaskRecPtr),
1173+
sizeof(TaskInfo->TaskName)-1);
1174+
TaskInfo->TaskName[sizeof(TaskInfo->TaskName)-1] = '\0';
1175+
1176+
/*
1177+
** Store away the Task ID ( for the QueryAllTasks Cmd )
1178+
*/
1179+
TaskInfo->TaskId = CFE_ES_TaskRecordGetID(TaskRecPtr);
1180+
1181+
/*
1182+
** Get the Execution counter for the task
1183+
*/
1184+
TaskInfo->ExecutionCounter = TaskRecPtr->ExecutionCounter;
1185+
1186+
/*
1187+
** Get the Application Details
1188+
*/
1189+
AppRecPtr = CFE_ES_LocateAppRecordByID(TaskRecPtr->AppId);
1190+
if (CFE_ES_AppRecordIsMatch(AppRecPtr, TaskRecPtr->AppId))
1191+
{
1192+
strncpy(TaskInfo->AppName,
1193+
CFE_ES_AppRecordGetName(AppRecPtr),
1194+
sizeof(TaskInfo->AppName)-1);
1195+
TaskInfo->AppName[sizeof(TaskInfo->AppName)-1] = '\0';
1196+
Status = CFE_SUCCESS;
1197+
}
1198+
else
1199+
{
1200+
/* task ID was OK but parent app ID is bad */
1201+
Status = CFE_ES_ERR_RESOURCEID_NOT_VALID;
1202+
}
1203+
}
1204+
1205+
CFE_ES_UnlockSharedData(__func__,__LINE__);
1206+
1207+
return(Status);
10461208

10471209
} /* End of CFE_ES_GetTaskInfo() */
10481210

0 commit comments

Comments
 (0)