Fixed:fast start media file save ok.

This commit is contained in:
Fancy code 2024-07-25 19:43:22 +08:00
parent 0c139866d2
commit dae04243be
8 changed files with 100 additions and 51 deletions

View File

@ -51,21 +51,10 @@ std::string MediaTask::GetTargetNameForSaving(void)
return mTargetName; return mTargetName;
} }
auto now = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now();
time_t t_now = std::chrono::system_clock::to_time_t(now);
struct tm tm_now = *std::localtime(&t_now);
mCreateTime_s = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()).count(); mCreateTime_s = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch()).count();
int hour = tm_now.tm_hour;
int minute = tm_now.tm_min;
int second = tm_now.tm_sec;
const std::string fileType = MediaTaskType::TAKE_VIDEO == mType ? ".mp4" : ".jpeg"; const std::string fileType = MediaTaskType::TAKE_VIDEO == mType ? ".mp4" : ".jpeg";
std::ostringstream pathStream; return CreateFileName(mSerialNumber, mSavePath, fileType);
pathStream << mSavePath << "xak47-" << mSerialNumber << "-" << std::setw(2) << std::setfill('0') << hour
<< std::setw(2) << std::setfill('0') << minute << std::setw(2) << std::setfill('0') << second
<< fileType;
mTargetName = pathStream.str();
LogInfo("GetTargetNameForSaving: %s\n", pathStream.str().c_str());
return pathStream.str();
} }
std::string MediaTask::GetThumbnailNameForSaving(const std::string &targetName) std::string MediaTask::GetThumbnailNameForSaving(const std::string &targetName)
{ {
@ -148,15 +137,24 @@ std::string MediaTask::GetFileNameBySeriaNumber(const unsigned long &serialNumbe
std::string extension = sourceFile.substr(dot_pos); std::string extension = sourceFile.substr(dot_pos);
fileType = extension; fileType = extension;
} }
return CreateFileName(serialNumber, savePaht, fileType);
}
std::string MediaTask::CreateFileName(const unsigned long &serialNumber, const std::string &savePaht,
const std::string &fileType)
{
auto now = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now();
time_t t_now = std::chrono::system_clock::to_time_t(now); time_t t_now = std::chrono::system_clock::to_time_t(now);
struct tm tm_now = *std::localtime(&t_now); struct tm tm_now = *std::localtime(&t_now);
/**
* @brief When the sequence number is 0, it indicates an invalid sequence number and is replaced by "???".
*
*/
const std::string serialNumberString = 0 == serialNumber ? "???" : std::to_string(serialNumber);
int hour = tm_now.tm_hour; int hour = tm_now.tm_hour;
int minute = tm_now.tm_min; int minute = tm_now.tm_min;
int second = tm_now.tm_sec; int second = tm_now.tm_sec;
std::ostringstream pathStream; std::ostringstream pathStream;
pathStream << savePaht << "xak47-" << serialNumber << "-" << std::setw(2) << std::setfill('0') << hour pathStream << savePaht << "xak47-" << serialNumberString << "-" << std::setw(2) << std::setfill('0') << hour
<< std::setw(2) << std::setfill('0') << minute << std::setw(2) << std::setfill('0') << second << std::setw(2) << std::setfill('0') << minute << std::setw(2) << std::setfill('0') << second
<< fileType; << fileType;
return pathStream.str(); return pathStream.str();

View File

@ -56,6 +56,8 @@ public:
static MediaTaskType WorkModeConvert(const WorkMode &mode); static MediaTaskType WorkModeConvert(const WorkMode &mode);
static std::string GetFileNameBySeriaNumber(const unsigned long &serialNumber, const std::string &sourceFile, static std::string GetFileNameBySeriaNumber(const unsigned long &serialNumber, const std::string &sourceFile,
const std::string &savePaht); const std::string &savePaht);
static std::string CreateFileName(const unsigned long &serialNumber, const std::string &savePaht,
const std::string &fileType);
private: private:
const MediaTaskType mType; const MediaTaskType mType;

View File

@ -109,16 +109,16 @@ bool SdCardHandleState::SdCardEventHandle(VStateMachineData *msg)
std::shared_ptr<VMissionDataV2<StorageEvent>> data = std::shared_ptr<VMissionDataV2<StorageEvent>> data =
std::dynamic_pointer_cast<VMissionDataV2<StorageEvent>>(message->mMissionData); std::dynamic_pointer_cast<VMissionDataV2<StorageEvent>>(message->mMissionData);
LogInfo(" SdCardEventHandle event:%s.\n", IStorageManager::GetInstance()->PrintStringStorageEvent(data->mData)); LogInfo(" SdCardEventHandle event:%s.\n", IStorageManager::GetInstance()->PrintStringStorageEvent(data->mData));
if (!mFastStartMediaFiles.empty() && StorageEvent::SD_CARD_INSERT == data->mData) { // if (!mFastStartMediaFiles.empty() && StorageEvent::SD_CARD_INSERT == data->mData) {
LogInfo("Sd card is inserted for the first time.\n"); // LogInfo("Sd card is inserted for the first time.\n");
// StatusCode code = IFilesManager::GetInstance()->SaveFile(*(mFileNeedToSave.get())); // // StatusCode code = IFilesManager::GetInstance()->SaveFile(*(mFileNeedToSave.get()));
StatusCode code = IFilesManager::GetInstance()->SaveFiles(mFastStartMediaFiles); // StatusCode code = IFilesManager::GetInstance()->SaveFiles(mFastStartMediaFiles);
if (IsCodeOK(code) == false) { // if (IsCodeOK(code) == false) {
LogError("SaveFile failed.\n"); // LogError("SaveFile failed.\n");
} // }
// mFileNeedToSave.reset(); // // mFileNeedToSave.reset();
mFastStartMediaFiles.clear(); // mFastStartMediaFiles.clear();
} // }
mSdCardStatus = data->mData; mSdCardStatus = data->mData;
/** /**
* @brief The file management uses a database. When the SD card is inserted or removed, the card's file data needs * @brief The file management uses a database. When the SD card is inserted or removed, the card's file data needs
@ -129,6 +129,16 @@ bool SdCardHandleState::SdCardEventHandle(VStateMachineData *msg)
std::shared_ptr<VMissionData> message = std::shared_ptr<VMissionData> message =
std::make_shared<VMissionData>(static_cast<MissionEvent>(InternalStateEvent::CHECK_UPGRADE_FILE)); std::make_shared<VMissionData>(static_cast<MissionEvent>(InternalStateEvent::CHECK_UPGRADE_FILE));
MissionStateMachine::GetInstance()->SendStateMessage(message); MissionStateMachine::GetInstance()->SendStateMessage(message);
if (!mFastStartMediaFiles.empty()) {
LogInfo("Sd card is inserted for the first time.\n");
// StatusCode code = IFilesManager::GetInstance()->SaveFile(*(mFileNeedToSave.get()));
StatusCode code = IFilesManager::GetInstance()->SaveFiles(mFastStartMediaFiles);
if (IsCodeOK(code) == false) {
LogError("SaveFile failed.\n");
}
// mFileNeedToSave.reset();
mFastStartMediaFiles.clear();
}
} }
else { else {
IFilesManager::GetInstance()->UnInit(); IFilesManager::GetInstance()->UnInit();

View File

@ -57,17 +57,19 @@ InfoToBeSaved FilesDatabase::CreateInfoForSavingFiles(const unsigned int &count)
StatusCode FilesDatabase::DbSaveFiles(const std::vector<SyncFileInfo> &info) StatusCode FilesDatabase::DbSaveFiles(const std::vector<SyncFileInfo> &info)
{ {
for (auto &each : info) { for (auto &each : info) {
unsigned long key = UNDEFINE_SERIAL_NUMBER;
bool result = SqliteHandle::GetInstance()->SyncFile(each, key);
if (!result) {
LogError("Save file failed.\n");
return CreateStatusCode(STATUS_CODE_NOT_OK);
}
if (!each.mSourceFile.empty()) { if (!each.mSourceFile.empty()) {
/** /**
* @brief If the source file parameter is passed in, the source file needs to be copied to overwrite the * @brief If the source file parameter is passed in, the source file needs to be copied to overwrite the
* target file. * target file.
*/ */
IStorageManager::GetInstance()->SaveFile(each.mSourceFile, each.mFileName); std::string saveFile = SqliteHandle::RenameFileToSync(each.mFileName, key);
} IStorageManager::GetInstance()->SaveFile(each.mSourceFile, saveFile);
bool result = SqliteHandle::GetInstance()->SyncFile(each);
if (!result) {
LogError("Save file failed.\n");
return CreateStatusCode(STATUS_CODE_NOT_OK);
} }
} }
return CreateStatusCode(STATUS_CODE_OK); return CreateStatusCode(STATUS_CODE_OK);

View File

@ -94,7 +94,7 @@ unsigned long int SqliteHandle::CreateFiles(const unsigned int &count)
if (SQLITE_OK != rc) { if (SQLITE_OK != rc) {
LogError("SQL error: %s\n", err_msg); LogError("SQL error: %s\n", err_msg);
sqlite3_free(err_msg); sqlite3_free(err_msg);
return 0; return UNDEFINE_SERIAL_NUMBER;
} }
} }
auto last_rowid_lambda = [](void *last_rowid, int argc, char **argv, char **azColName) -> int { auto last_rowid_lambda = [](void *last_rowid, int argc, char **argv, char **azColName) -> int {
@ -102,7 +102,7 @@ unsigned long int SqliteHandle::CreateFiles(const unsigned int &count)
LogInfo("last_rowid key = %s\n", argv[0]); LogInfo("last_rowid key = %s\n", argv[0]);
*(unsigned long int *)last_rowid = strtoul(argv[0], nullptr, 10); *(unsigned long int *)last_rowid = strtoul(argv[0], nullptr, 10);
} }
return 0; return UNDEFINE_SERIAL_NUMBER;
}; };
unsigned long int last_rowid = 0; unsigned long int last_rowid = 0;
const char *sql2 = "SELECT last_insert_rowid();"; const char *sql2 = "SELECT last_insert_rowid();";
@ -110,16 +110,20 @@ unsigned long int SqliteHandle::CreateFiles(const unsigned int &count)
if (SQLITE_OK != rc) { if (SQLITE_OK != rc) {
LogError("SQL error: %s\n", err_msg); LogError("SQL error: %s\n", err_msg);
sqlite3_free(err_msg); sqlite3_free(err_msg);
return 0; return UNDEFINE_SERIAL_NUMBER;
} }
constexpr int MINIMUM_AUTO_INCREMENT_PRIMARY_KEY = 1; constexpr int MINIMUM_AUTO_INCREMENT_PRIMARY_KEY = 1;
return last_rowid - count + MINIMUM_AUTO_INCREMENT_PRIMARY_KEY; return last_rowid - count + MINIMUM_AUTO_INCREMENT_PRIMARY_KEY;
} }
bool SqliteHandle::SyncFile(const SyncFileInfo &info) bool SqliteHandle::SyncFile(const SyncFileInfo &info, unsigned long &key)
{ {
if (UNDEFINE_SERIAL_NUMBER == info.mSerialNumber) { unsigned long serialNumber = info.mSerialNumber;
LogError("Serial number is undefine.\n"); std::string fileName = info.mFileName;
return false; if (UNDEFINE_SERIAL_NUMBER == serialNumber) {
LogWarning("Serial number is undefine, create new one.\n");
serialNumber = CreateFiles(1);
key = serialNumber;
fileName = SqliteHandle::RenameFileToSync(fileName, key);
} }
std::stringstream sqlStream; std::stringstream sqlStream;
std::string comma = " "; std::string comma = " ";
@ -129,7 +133,7 @@ bool SqliteHandle::SyncFile(const SyncFileInfo &info)
comma = ", "; comma = ", ";
} }
if (info.mFileName.empty() == false) { if (info.mFileName.empty() == false) {
sqlStream << comma << FILE_PATH " = '" << info.mFileName << "'"; sqlStream << comma << FILE_PATH " = '" << fileName << "'";
comma = ", "; comma = ", ";
} }
if (UNDEFINE_FILE_SIZE != info.mFileSize) { if (UNDEFINE_FILE_SIZE != info.mFileSize) {
@ -148,7 +152,7 @@ bool SqliteHandle::SyncFile(const SyncFileInfo &info)
sqlStream << comma << FILE_DURATION " = '" << info.mFileDuration << "'"; sqlStream << comma << FILE_DURATION " = '" << info.mFileDuration << "'";
comma = ", "; comma = ", ";
} }
sqlStream << " WHERE " TABLE_KEY " = " << info.mSerialNumber << ";"; sqlStream << " WHERE " TABLE_KEY " = " << serialNumber << ";";
LogInfo("Sql: %s\n", sqlStream.str().c_str()); LogInfo("Sql: %s\n", sqlStream.str().c_str());
char *errMsg = nullptr; char *errMsg = nullptr;
int rc = SQLITE_UNDEFINE; int rc = SQLITE_UNDEFINE;
@ -447,3 +451,15 @@ FileStatus SqliteHandle::ConvertStringToFileStatus(const std::string &status)
} }
return FileStatus::END; return FileStatus::END;
} }
std::string SqliteHandle::RenameFileToSync(const std::string &sourceFile, unsigned long &key)
{
std::string original = sourceFile;
const std::string pattern = "???";
std::string replacement = std::to_string(key);
size_t pos = 0;
while ((pos = original.find(pattern, pos)) != std::string::npos) {
original.replace(pos, pattern.length(), replacement);
pos += replacement.length();
}
return original;
}

View File

@ -30,8 +30,22 @@ public:
static std::shared_ptr<SqliteHandle> &GetInstance(std::shared_ptr<SqliteHandle> *impl = nullptr); static std::shared_ptr<SqliteHandle> &GetInstance(std::shared_ptr<SqliteHandle> *impl = nullptr);
void Init(const std::string &dbFileName); void Init(const std::string &dbFileName);
void UnInit(void); void UnInit(void);
/**
* @brief Request to create a file and return the minimum value of the file's unique serial number.
*
* @param count
* @return unsigned long int If invalid, returns UNDEFINE_SERIAL_NUMBER.
*/
unsigned long int CreateFiles(const unsigned int &count); unsigned long int CreateFiles(const unsigned int &count);
bool SyncFile(const SyncFileInfo &info); /**
* @brief Synchronize file information. When the synchronized file number is invalid, a new number will be created
* and assigned to the given parameter "key".
* @param info
* @param key [out] If the key value does not exist, it is created and output as a parameter.
* @return true
* @return false
*/
bool SyncFile(const SyncFileInfo &info, unsigned long &key);
bool SearchFiles(const std::vector<FileCreateType> &types, std::vector<SyncFileInfo> &info); bool SearchFiles(const std::vector<FileCreateType> &types, std::vector<SyncFileInfo> &info);
bool Remove(); bool Remove();
bool Modified(); bool Modified();
@ -51,6 +65,9 @@ private:
static std::string ConvertFileStatusToString(const FileStatus &status); static std::string ConvertFileStatusToString(const FileStatus &status);
static FileStatus ConvertStringToFileStatus(const std::string &status); static FileStatus ConvertStringToFileStatus(const std::string &status);
public:
static std::string RenameFileToSync(const std::string &sourceFile, unsigned long &key);
private: private:
sqlite3 *mDb; sqlite3 *mDb;
}; };

View File

@ -54,6 +54,21 @@ TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_TakePicture)
MainThread::GetInstance()->Runing(); MainThread::GetInstance()->Runing();
} }
// ../output_files/test/bin/HuntingCameraTest // ../output_files/test/bin/HuntingCameraTest
// --gtest_filter=HuntingCameraTest.INTEGRATION_HunttingCamera_EXAMPLE_FastStartMediaHandle
TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_FastStartMediaHandle)
{
McuManagerTestTool::MockOtherSideIpcMissionReply(IpcMission::TEST);
SetAllCamerasResult(mAllCamerasMock);
HalTestTool::MockSdCardRemove(mLinuxTest);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
MainThread::GetInstance()->Init();
TestManager::ResetTimeOut(1000 * 5);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
HalTestTool::MockSdCardInsert(mLinuxTest);
HalTestTool::MockKeyClick("reset", 200); // Simulate pressing a button.
MainThread::GetInstance()->Runing();
}
// ../output_files/test/bin/HuntingCameraTest
// --gtest_filter=HuntingCameraTest.INTEGRATION_HunttingCamera_EXAMPLE_MediaTask // --gtest_filter=HuntingCameraTest.INTEGRATION_HunttingCamera_EXAMPLE_MediaTask
TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask) TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask)
{ {

View File

@ -62,17 +62,6 @@ void CameraHalTest::SetCameraMonitorTrace(std::shared_ptr<VCameraHalMonitor> &mo
StatusCode CameraHalTest::StartSingleTask(const CameraTaskParam &param) StatusCode CameraHalTest::StartSingleTask(const CameraTaskParam &param)
{ {
LogInfo("CameraHalTest::StartSingleTask\n"); LogInfo("CameraHalTest::StartSingleTask\n");
// if (mTaskTimerThread.joinable()) {
// mTaskTimerThread.join();
// }
// ReadFileInit();
// auto taskTimerThread = [=](std::shared_ptr<CameraHalTest> cameraHal) {
// LogInfo("MockReportMediaStream start.\n");
// cameraHal->MockReportMediaStream();
// };
// std::shared_ptr<CameraHalTest> cameraHal =
// std::dynamic_pointer_cast<CameraHalTest>(CameraHal::shared_from_this()); mTaskTimerThread =
// std::thread(taskTimerThread, cameraHal);
StatusCode code = StartSingleTaskTrace(param); StatusCode code = StartSingleTaskTrace(param);
if (StatusCodeEqual(code, "STATUS_CODE_VIRTUAL_FUNCTION")) { if (StatusCodeEqual(code, "STATUS_CODE_VIRTUAL_FUNCTION")) {
return CameraHal::StartSingleTask(param); return CameraHal::StartSingleTask(param);