Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sch_lab IC:Caelum+dev2 #105

Merged
merged 4 commits into from
Jan 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/codeql-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ on:
jobs:
codeql:
name: Codeql
uses: nasa/cFS/.github/workflows/codeql-build.yml@main
uses: astrogeco/cFS/.github/workflows/codeql-build.yml@integration-candidate
with:
make-prep: 'make prep'
make: 'make sch_lab'

component-path: apps/sch_lab
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ To change the list of packets that sch_lab sends out, edit the schedule table lo

## Version History

### Development Build: v2.5.0-rc4+dev13

- Add option to configure base tick rate
- Reuse CodeQL, Static Analyis, and Format Check
- See <https://github.com/nasa/sch_lab/pull/105> and <https://github.com/nasa/cFS/pull/410>

### Development Build: v2.5.0-rc4+dev6

- Use separate address variable
Expand Down
3 changes: 2 additions & 1 deletion fsw/platform_inc/sch_lab_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,13 @@
typedef struct
{
CFE_SB_MsgId_t MessageID; /* Message ID for the table entry */
uint32 PacketRate; /* Rate: Send packet every N seconds */
uint32 PacketRate; /* Rate: Send packet every N ticks */
CFE_MSG_FcnCode_t FcnCode; /* Command/Function code to set */
} SCH_LAB_ScheduleTableEntry_t;

typedef struct
{
uint32 TickRate; /* Ticks per second to configure for timer (0=default) */
SCH_LAB_ScheduleTableEntry_t Config[SCH_LAB_MAX_SCHEDULE_ENTRIES];
} SCH_LAB_ScheduleTable_t;

Expand Down
80 changes: 75 additions & 5 deletions fsw/src/sch_lab_app.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ typedef struct
typedef struct
{
SCH_LAB_StateEntry_t State[SCH_LAB_MAX_SCHEDULE_ENTRIES];
osal_id_t TimerId;
osal_id_t TimingSem;
CFE_TBL_Handle_t TblHandle;
CFE_SB_PipeId_t CmdPipe;
} SCH_LAB_GlobalData_t;
Expand All @@ -80,8 +82,9 @@ void SCH_Lab_AppMain(void)
{
int i;
uint32 SCH_OneHzPktsRcvd = 0;
uint32 Status = CFE_SUCCESS;
uint32 RunStatus = CFE_ES_RunStatus_APP_RUN;
int32 OsStatus;
CFE_Status_t Status;
uint32 RunStatus = CFE_ES_RunStatus_APP_RUN;
SCH_LAB_StateEntry_t *LocalStateEntry;
CFE_SB_Buffer_t * SBBufPtr;

Expand All @@ -99,16 +102,29 @@ void SCH_Lab_AppMain(void)
{
CFE_ES_PerfLogExit(SCH_MAIN_TASK_PERF_ID);

/* Pend on receipt of 1Hz packet */
Status = CFE_SB_ReceiveBuffer(&SBBufPtr, SCH_LAB_Global.CmdPipe, CFE_SB_PEND_FOREVER);
/* Pend on timing sem */
OsStatus = OS_CountSemTake(SCH_LAB_Global.TimingSem);
if (OsStatus == OS_SUCCESS)
{
/* check for arrival of the 1Hz - this should sync counts (TBD) */
Status = CFE_SB_ReceiveBuffer(&SBBufPtr, SCH_LAB_Global.CmdPipe, CFE_SB_POLL);
}
else
{
Status = CFE_STATUS_EXTERNAL_RESOURCE_FAIL;
}

CFE_ES_PerfLogEntry(SCH_MAIN_TASK_PERF_ID);

if (Status == CFE_SUCCESS)
{
SCH_OneHzPktsRcvd++;
}

if (OsStatus == OS_SUCCESS && SCH_OneHzPktsRcvd > 0)
{
/*
** Process table every second, sending packets that are ready
** Process table every tick, sending packets that are ready
*/
LocalStateEntry = SCH_LAB_Global.State;
for (i = 0; i < SCH_LAB_MAX_SCHEDULE_ENTRIES; i++)
Expand All @@ -132,6 +148,11 @@ void SCH_Lab_AppMain(void)

} /* end SCH_Lab_AppMain */

void SCH_LAB_LocalTimerCallback(osal_id_t object_id, void *arg)
{
OS_CountSemGive(SCH_LAB_Global.TimingSem);
}

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* SCH_LAB_AppInit() -- initialization */
Expand All @@ -141,13 +162,39 @@ int32 SCH_LAB_AppInit(void)
{
int i;
int32 Status;
int32 OsStatus;
uint32 TimerPeriod;
osal_id_t TimeBaseId;
SCH_LAB_ScheduleTable_t * ConfigTable;
SCH_LAB_ScheduleTableEntry_t *ConfigEntry;
SCH_LAB_StateEntry_t * LocalStateEntry;
void * TableAddr;

memset(&SCH_LAB_Global, 0, sizeof(SCH_LAB_Global));

OsStatus = OS_CountSemCreate(&SCH_LAB_Global.TimingSem, "SCH_LAB", 0, 0);
if (OsStatus != OS_SUCCESS)
{
CFE_ES_WriteToSysLog("%s: OS_CountSemCreate failed:RC=%ld\n", __func__, (long)OsStatus);
return CFE_STATUS_EXTERNAL_RESOURCE_FAIL;
}

/* The underlying timebase object should have been created by the PSP */
OsStatus = OS_TimeBaseGetIdByName(&TimeBaseId, "cFS-Master");
if (OsStatus != OS_SUCCESS)
{
CFE_ES_WriteToSysLog("%s: OS_TimeBaseGetIdByName failed:RC=%ld\n", __func__, (long)OsStatus);
return CFE_STATUS_EXTERNAL_RESOURCE_FAIL;
}

/* Create the timer callback (but not set yet, as that requires the config table) */
OsStatus = OS_TimerAdd(&SCH_LAB_Global.TimerId, "SCH_LAB", TimeBaseId, SCH_LAB_LocalTimerCallback, NULL);
if (OsStatus != OS_SUCCESS)
{
CFE_ES_WriteToSysLog("%s: OS_TimerAdd failed:RC=%ld\n", __func__, (long)OsStatus);
return CFE_STATUS_EXTERNAL_RESOURCE_FAIL;
}

/*
** Register tables with cFE and load default data
*/
Expand Down Expand Up @@ -206,6 +253,22 @@ int32 SCH_LAB_AppInit(void)
++LocalStateEntry;
}

if (ConfigTable->TickRate == 0)
{
/* use default of 1 second */
CFE_ES_WriteToSysLog("%s: Using default tick rate of 1 second\n", __func__);
TimerPeriod = 1000000;
}
else
{
TimerPeriod = 1000000 / ConfigTable->TickRate;
if ((TimerPeriod * ConfigTable->TickRate) != 1000000)
{
CFE_ES_WriteToSysLog("%s: WARNING: tick rate of %lu is not an integer number of microseconds\n", __func__,
(unsigned long)ConfigTable->TickRate);
}
}

/*
** Release the table
*/
Expand All @@ -228,6 +291,13 @@ int32 SCH_LAB_AppInit(void)
OS_printf("SCH Error subscribing to 1hz!\n");
}

/* Set timer period */
OsStatus = OS_TimerSet(SCH_LAB_Global.TimerId, 1000000, TimerPeriod);
if (OsStatus != OS_SUCCESS)
{
CFE_ES_WriteToSysLog("%s: OS_TimerSet failed:RC=%ld\n", __func__, (long)OsStatus);
}

OS_printf("SCH Lab Initialized.%s\n", SCH_LAB_VERSION_STRING);

return (CFE_SUCCESS);
Expand Down
2 changes: 1 addition & 1 deletion fsw/src/sch_lab_version.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
*/

/* Development Build Macro Definitions */
#define SCH_LAB_BUILD_NUMBER 6 /*!< Development Build: Number of commits since baseline */
#define SCH_LAB_BUILD_NUMBER 13 /*!< Development Build: Number of commits since baseline */
#define SCH_LAB_BUILD_BASELINE \
"v2.5.0-rc4" /*!< Development Build: git tag that is the base for the current development */

Expand Down
3 changes: 2 additions & 1 deletion fsw/tables/sch_lab_table.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@
** 3. If the table grows too big, increase SCH_LAB_MAX_SCHEDULE_ENTRIES
*/

SCH_LAB_ScheduleTable_t SCH_TBL_Structure = {.Config = {
SCH_LAB_ScheduleTable_t SCH_TBL_Structure = {.TickRate = 1,
.Config = {
{CFE_SB_MSGID_WRAP_VALUE(CFE_ES_SEND_HK_MID), 4, 0},
{CFE_SB_MSGID_WRAP_VALUE(CFE_EVS_SEND_HK_MID), 4, 0},
{CFE_SB_MSGID_WRAP_VALUE(CFE_TIME_SEND_HK_MID), 4, 0},
Expand Down