diff --git a/docs/dox_src/cfs_ds.dox b/docs/dox_src/cfs_ds.dox
index 84de6cf..cd327fa 100644
--- a/docs/dox_src/cfs_ds.dox
+++ b/docs/dox_src/cfs_ds.dox
@@ -147,12 +147,10 @@
the platform.
Move File Capability
- If the DS_MOVE_FILES configuration parameter is set to a non-empty string, the telemetry
+ If the MoveFilesDestDir global variable is set to a non-empty string at app initialization, the telemetry
database, Destination File table load images and the File Table display page
- require changes. The Destination File Table rdl file uses the DS_MOVE_FILES
- definition in the ds_platform_cfg.h file. However, in order to get the
- required parameter included in telemetry, this configuration parameter must be
- set to 1 rather than TRUE. The table images must include this parameter in
+ require changes. The Destination File Table rdl file uses the DS_MOVEFILES_DESTDIR
+ definition in the ds_platform_cfg.h file. The table images must include this parameter in
order to load successfully and the display page must be modified to display
this parameter.
**/
diff --git a/fsw/inc/ds_platform_cfg.h b/fsw/inc/ds_platform_cfg.h
index f5c1a3b..f16db75 100644
--- a/fsw/inc/ds_platform_cfg.h
+++ b/fsw/inc/ds_platform_cfg.h
@@ -427,25 +427,6 @@
*/
#define DS_FILE_HEADER_TYPE 1
-/**
- * \brief Move Files to Downlink Directory After Close Selection
- *
- * \par Description:
- * Set this parameter to enable the code and structures to
- * automatically move DS files to another directory after
- * closing the files. The intended use for this setting is
- * to move files from a working directory into a directory
- * from which the files can be downlinked. Note that even
- * after enabling this feature, files will not be moved if
- * the move pathname in the Destination File Table is null.
- *
- * \par Limits
- * This parameter must be set to one of the following:
- * non-empty string = add move pathname field to Destination File Table
- * empty string = do not add move pathname to Destination File Table
- */
-#define DS_MOVE_FILES "Move to downlink directory"
-
/**
* \brief Application Per Packet Pipe Limit
*
@@ -462,6 +443,19 @@
*/
#define DS_PER_PACKET_PIPE_LIMIT 45
+/**
+ * \brief Destination File Table -- default table movename
+ *
+ * \par Description:
+ * This parameter defines the default movename for the
+ * Destination File Table.
+ *
+ * \par Limits:
+ * The string length (including string terminator) cannot exceed
+ * #OS_MAX_PATH_LEN. (limit is not verified)
+ */
+#define DS_MOVEFILES_DESTDIR "Move to downlink directory"
+
/**\}*/
#endif
diff --git a/fsw/src/ds_app.c b/fsw/src/ds_app.c
index 9f7b74b..5624bd5 100644
--- a/fsw/src/ds_app.c
+++ b/fsw/src/ds_app.c
@@ -184,6 +184,7 @@ CFE_Status_t DS_AppInitialize(void)
memset(&DS_AppData, 0, sizeof(DS_AppData));
DS_AppData.AppEnableState = DS_DEF_ENABLE_STATE;
+ strncpy(DS_AppData.MoveFilesDestDir, DS_MOVEFILES_DESTDIR, sizeof(DS_AppData.MoveFilesDestDir));
/*
** Mark files as closed
diff --git a/fsw/src/ds_app.h b/fsw/src/ds_app.h
index 94c731a..9736b99 100644
--- a/fsw/src/ds_app.h
+++ b/fsw/src/ds_app.h
@@ -50,6 +50,11 @@
#define DS_SB_TIMEOUT 1000
#define DS_SECS_PER_TIMEOUT (DS_SB_TIMEOUT / 1000)
+/**
+ * \brief Array size for DS file move trigger
+ */
+#define MOVE_FILES_TRIGGER_SIZE 64
+
/**
* \brief Current state of destination files
*/
@@ -104,6 +109,9 @@ typedef struct
DS_HashLink_t HashLinks[DS_PACKETS_IN_FILTER_TABLE]; /**< \brief Hash table linked list elements */
DS_HashLink_t *HashTable[DS_HASH_TABLE_ENTRIES]; /**< \brief Each hash table entry is a linked list */
+
+ char MoveFilesDestDir[MOVE_FILES_TRIGGER_SIZE]; /**< \brief Triggers file move to downlink directory if non-empty,
+ disables otherwise */
} DS_AppData_t;
/** \brief DS global data structure reference */
diff --git a/fsw/src/ds_file.c b/fsw/src/ds_file.c
index 2aea73c..5812122 100644
--- a/fsw/src/ds_file.c
+++ b/fsw/src/ds_file.c
@@ -811,7 +811,7 @@ void DS_FileCloseDest(int32 FileIndex)
*/
OS_close(FileStatus->FileHandle);
- if (strlen(DS_MOVE_FILES) > 0)
+ if (DS_AppData.MoveFilesDestDir[0] != '\0')
{
/*
** Move file only if table has a downlink directory name...
diff --git a/fsw/src/ds_verify.h b/fsw/src/ds_verify.h
index f0fed9c..2dd7d41 100644
--- a/fsw/src/ds_verify.h
+++ b/fsw/src/ds_verify.h
@@ -190,10 +190,6 @@
#error DS_FILE_HEADER_TYPE must be 0 or 1!
#endif
-#ifndef DS_MOVE_FILES
-#error "DS_MOVE_FILES must be defined!"
-#endif
-
#ifndef DS_PER_PACKET_PIPE_LIMIT
#error DS_PER_PACKET_PIPE_LIMIT must be defined!
#elif (DS_PER_PACKET_PIPE_LIMIT < 1)
@@ -202,4 +198,8 @@
#error DS_PER_PACKET_PIPE_LIMIT cannot be greater than DS_APP_PIPE_DEPTH!
#endif
+#ifndef DS_MOVEFILES_DESTDIR
+#error "DS_MOVEFILES_DESTDIR must be defined!"
+#endif
+
#endif
diff --git a/unit-test/ds_cmds_tests.c b/unit-test/ds_cmds_tests.c
index 7b7e893..c751624 100644
--- a/unit-test/ds_cmds_tests.c
+++ b/unit-test/ds_cmds_tests.c
@@ -991,7 +991,7 @@ void DS_SetDestSizeCmd_Test_FileTableNotLoaded(void)
UT_SetDefaultReturnValue(UT_KEY(DS_TableVerifySize), true);
/* Execute the function being tested */
- UtAssert_VOIDCALL(DS_SetDestSizeCmd(&UT_CmdBuf.Buf));
+ UtAssert_VOIDCALL(DS_SetDestSizeCmd(&UT_CmdBuf.Buf));
/* Verify results */
UtAssert_UINT32_EQ(DS_AppData.CmdRejectedCounter, 1);
@@ -1276,7 +1276,7 @@ void DS_CloseAllCmd_Test_Nominal(void)
DS_AppData.FileStatus[i].FileHandle = OS_OBJECT_ID_UNDEFINED;
}
- if (strlen(DS_MOVE_FILES) > 0)
+ if (DS_AppData.MoveFilesDestDir[0] != '\0')
{
strncpy(DS_AppData.DestFileTblPtr->File[0].Movename, "", DS_PATHNAME_BUFSIZE);
}
diff --git a/unit-test/ds_file_tests.c b/unit-test/ds_file_tests.c
index 93240cd..58f6fd9 100644
--- a/unit-test/ds_file_tests.c
+++ b/unit-test/ds_file_tests.c
@@ -297,7 +297,7 @@ void DS_FileSetupWrite_Test_MaxFileSizeExceeded(void)
strncpy(DS_AppData.FileStatus[FileIndex].FileName, "directory1/",
sizeof(DS_AppData.FileStatus[FileIndex].FileName));
- if (strlen(DS_MOVE_FILES) > 0)
+ if (DS_AppData.MoveFilesDestDir[0] != '\0')
{
strncpy(DS_AppData.DestFileTblPtr->File[FileIndex].Movename, "directory2/movename/",
sizeof(DS_AppData.DestFileTblPtr->File[FileIndex].Movename));
@@ -572,10 +572,7 @@ void DS_FileCreateDest_Test_ClosedFileHandle(void)
DS_AppData.DestFileTblPtr->File[FileIndex].FileNameType = DS_BY_COUNT;
DS_AppData.FileStatus[FileIndex].FileCount = 1;
- if (strlen(DS_MOVE_FILES) > 0)
- {
- DS_AppData.DestFileTblPtr->File[FileIndex].Movename[0] = '\0';
- }
+ DS_AppData.DestFileTblPtr->File[FileIndex].Movename[0] = '\0';
/* Set to fail header write, which will call OS_close and clear the handle */
if (DS_FILE_HEADER_TYPE == DS_FILE_HEADER_CFE)
@@ -897,7 +894,8 @@ void DS_FileUpdateHeader_Test_PlatformConfigCFE_SeekError(void)
void DS_FileCloseDest_Test_PlatformConfigMoveFiles_Nominal(void)
{
- int32 FileIndex = 0;
+ int32 FileIndex = 0;
+ const char MoveFilesTrigger[] = "Move to downlink directory";
/* Set up the handle */
OS_OpenCreate(&DS_AppData.FileStatus[FileIndex].FileHandle, NULL, 0, 0);
@@ -906,6 +904,7 @@ void DS_FileCloseDest_Test_PlatformConfigMoveFiles_Nominal(void)
sizeof(DS_AppData.FileStatus[FileIndex].FileName));
strncpy(DS_AppData.DestFileTblPtr->File[FileIndex].Movename, "directory2/movename/",
sizeof(DS_AppData.DestFileTblPtr->File[FileIndex].Movename));
+ strncpy(DS_AppData.MoveFilesDestDir, MoveFilesTrigger, sizeof(DS_AppData.MoveFilesDestDir));
/* Execute the function being tested */
UtAssert_VOIDCALL(DS_FileCloseDest(FileIndex));
@@ -920,7 +919,9 @@ void DS_FileCloseDest_Test_PlatformConfigMoveFiles_Nominal(void)
void DS_FileCloseDest_Test_PlatformConfigMoveFiles_MoveError(void)
{
- int32 FileIndex = 0;
+ int32 FileIndex = 0;
+ const char MoveFilesTrigger[] = "Move to downlink directory";
+ strncpy(DS_AppData.MoveFilesDestDir, MoveFilesTrigger, sizeof(DS_AppData.MoveFilesDestDir));
/* Set up the handle */
OS_OpenCreate(&DS_AppData.FileStatus[FileIndex].FileHandle, NULL, 0, 0);
@@ -946,8 +947,9 @@ void DS_FileCloseDest_Test_PlatformConfigMoveFiles_MoveError(void)
void DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameTooLarge(void)
{
- int32 FileIndex = 0;
- const char DirName[] = "directory1/";
+ int32 FileIndex = 0;
+ const char DirName[] = "directory1/";
+ const char MoveFilesTrigger[] = "Move to downlink directory";
/* Set up the handle */
OS_OpenCreate(&DS_AppData.FileStatus[FileIndex].FileHandle, NULL, 0, 0);
@@ -958,6 +960,7 @@ void DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameTooLarge(void)
DS_AppData.FileStatus[FileIndex].FileName[DS_TOTAL_FNAME_BUFSIZE - 1] = '\0';
strncpy(DS_AppData.DestFileTblPtr->File[FileIndex].Movename, "directory2/movename/",
sizeof(DS_AppData.DestFileTblPtr->File[FileIndex].Movename));
+ strncpy(DS_AppData.MoveFilesDestDir, MoveFilesTrigger, sizeof(DS_AppData.MoveFilesDestDir));
/* Execute the function being tested */
UtAssert_VOIDCALL(DS_FileCloseDest(FileIndex));
@@ -972,13 +975,15 @@ void DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameTooLarge(void)
void DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameNull(void)
{
- int32 FileIndex = 0;
+ int32 FileIndex = 0;
+ const char MoveFilesTrigger[] = "Move to downlink directory";
/* Set up the handle */
OS_OpenCreate(&DS_AppData.FileStatus[FileIndex].FileHandle, NULL, 0, 0);
strncpy(DS_AppData.DestFileTblPtr->File[FileIndex].Movename, "directory2/movename",
sizeof(DS_AppData.DestFileTblPtr->File[FileIndex].Movename));
+ strncpy(DS_AppData.MoveFilesDestDir, MoveFilesTrigger, sizeof(DS_AppData.MoveFilesDestDir));
/* Execute the function being tested */
UtAssert_VOIDCALL(DS_FileCloseDest(FileIndex));
@@ -993,13 +998,34 @@ void DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameNull(void)
UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 1);
}
-void DS_FileCloseDest_Test_MoveFilesFalse(void)
+void DS_FileCloseDest_Test_PlatformConfigMoveFiles_MovenameNull(void)
{
- int32 FileIndex = 0;
+ int32 FileIndex = 0;
+ const char MoveFilesTrigger[] = "Move to downlink directory";
/* Set up the handle */
OS_OpenCreate(&DS_AppData.FileStatus[FileIndex].FileHandle, NULL, 0, 0);
+ strncpy(DS_AppData.DestFileTblPtr->File[FileIndex].Movename, "",
+ sizeof(DS_AppData.DestFileTblPtr->File[FileIndex].Movename));
+ strncpy(DS_AppData.MoveFilesDestDir, MoveFilesTrigger, sizeof(DS_AppData.MoveFilesDestDir));
+
+ /* Execute the function being tested */
+ UtAssert_VOIDCALL(DS_FileCloseDest(FileIndex));
+
+ /* Verify results */
+ UtAssert_STUB_COUNT(CFE_SB_MessageStringGet, 0);
+}
+
+void DS_FileCloseDest_Test_PlatformConfigMoveFiles_EmptyMoveFilesTrigger(void)
+{
+ int32 FileIndex = 0;
+ const char MoveFilesTrigger[] = "";
+
+ /* Set up the handle */
+ OS_OpenCreate(&DS_AppData.FileStatus[FileIndex].FileHandle, NULL, 0, 0);
+ strncpy(DS_AppData.MoveFilesDestDir, MoveFilesTrigger, sizeof(DS_AppData.MoveFilesDestDir));
+
/* Execute the function being tested */
UtAssert_VOIDCALL(DS_FileCloseDest(FileIndex));
@@ -1304,17 +1330,12 @@ void UtTest_Setup(void)
UT_DS_TEST_ADD(DS_FileUpdateHeader_Test_PlatformConfigCFE_SeekError);
}
- if (strlen(DS_MOVE_FILES) > 0)
- {
- UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_Nominal);
- UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_MoveError);
- UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameTooLarge);
- UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameNull);
- }
- else
- {
- UT_DS_TEST_ADD(DS_FileCloseDest_Test_MoveFilesFalse);
- }
+ UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_Nominal);
+ UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_MoveError);
+ UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameTooLarge);
+ UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_FilenameNull);
+ UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_MovenameNull);
+ UT_DS_TEST_ADD(DS_FileCloseDest_Test_PlatformConfigMoveFiles_EmptyMoveFilesTrigger);
UT_DS_TEST_ADD(DS_FileTestAge_Test_Nominal);
UT_DS_TEST_ADD(DS_FileTestAge_Test_ExceedMaxAge);