|
@@ -1,5 +1,6 @@
|
|
#include "CreateLongFileThread.h"
|
|
#include "CreateLongFileThread.h"
|
|
|
|
|
|
|
|
+#include "AudioData.h"
|
|
#include "GlobalInfo.h"
|
|
#include "GlobalInfo.h"
|
|
#include "spdlog.h"
|
|
#include "spdlog.h"
|
|
#include <cstring>
|
|
#include <cstring>
|
|
@@ -35,7 +36,16 @@ bool CreateLongFileThread::setData(const AudioSrcData& srcData)
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* ------------------------------------------------------------------------------- */
|
|
|
|
+ /* 先写入记录报警文件的环形缓冲区 */
|
|
|
|
+ auto oldData = m_ringQueue.push_pop(new AudioSrcData(srcData));
|
|
|
|
+ if(oldData != nullptr)
|
|
|
|
+ {
|
|
|
|
+ delete oldData;
|
|
|
|
+ oldData = nullptr;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ /* ------------------------------------------------------------------------------- */
|
|
/* 锁定缓冲区 */
|
|
/* 锁定缓冲区 */
|
|
std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
/* 如果缓冲区没有分配内存,先分配 */
|
|
/* 如果缓冲区没有分配内存,先分配 */
|
|
@@ -71,11 +81,22 @@ bool CreateLongFileThread::setData(const AudioSrcData& srcData)
|
|
/* 开启录制 */
|
|
/* 开启录制 */
|
|
bool CreateLongFileThread::startRecordAlarmFile(const AlarmInfo_t& alarmInfo)
|
|
bool CreateLongFileThread::startRecordAlarmFile(const AlarmInfo_t& alarmInfo)
|
|
{
|
|
{
|
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
|
|
+ /* 先检查是否已经在队列中了 */
|
|
|
|
+ AlarmKey_t key = {alarmInfo.CompareItemID, alarmInfo.RoadInfo.nCompareRoadNum,
|
|
|
|
+ alarmInfo.AlarmType, alarmInfo.StartTime};
|
|
|
|
+ if(m_mapAlarmFile.find(key) != m_mapAlarmFile.end())
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "{} 已经在报警录制队列中,无法重复添加", m_logBase);
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ /* 添加一个新的报警文件路径 */
|
|
|
|
+ QString fileName = generateFileName(alarmInfo.StartTime, alarmInfo.EndTime);
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-/* 停止录制 */
|
|
|
|
|
|
+/* 停止录制,alarmInfo既是传入参数,也是传出参数,传出文件路径和开始位置 */
|
|
bool CreateLongFileThread::stopRecordAlarmFile(AlarmInfo_t& alarmInfo)
|
|
bool CreateLongFileThread::stopRecordAlarmFile(AlarmInfo_t& alarmInfo)
|
|
{
|
|
{
|
|
|
|
|
|
@@ -100,118 +121,18 @@ void CreateLongFileThread::task()
|
|
|
|
|
|
while(m_isRunning)
|
|
while(m_isRunning)
|
|
{
|
|
{
|
|
- /* 线程休眠1秒 */
|
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
|
|
|
-
|
|
|
|
- /* 判断缓存是否达到1分钟数据临界值 */
|
|
|
|
- {
|
|
|
|
- std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
|
|
- if(m_bufferData.dataSize < m_writeCriticalSize)
|
|
|
|
- {
|
|
|
|
- continue; // 缓存数据不足,继续等待
|
|
|
|
- }
|
|
|
|
- /* 数据足够了将缓冲区数据拷贝出来 */
|
|
|
|
- memcpy(m_srcData.pData, m_bufferData.pData, m_bufferData.dataSize);
|
|
|
|
- m_srcData.dataSize = m_bufferData.dataSize;
|
|
|
|
- m_srcData.startTime = m_bufferData.startTime;
|
|
|
|
- m_srcData.endTime = m_bufferData.endTime;
|
|
|
|
- /* 清空缓冲区数据 */
|
|
|
|
- m_bufferData.clear();
|
|
|
|
- }
|
|
|
|
- // SPDLOG_LOGGER_DEBUG(m_logger, "{} 设置数据,dataSize: {}, startTime: {}, endTime: {}",
|
|
|
|
- // m_logBase, m_srcData.dataSize, m_srcData.startTime.toString("yyyy-MM-dd hh:mm:ss").toStdString(), m_srcData.endTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
|
|
|
|
|
|
+ /* 线程休眠100ms */
|
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
|
|
/*--------------------------------------------------------------
|
|
/*--------------------------------------------------------------
|
|
- * 打开文件。写入的时候判断是否到达了整点,如果到达了整点,则关闭文件
|
|
|
|
- * 重新创建一个新的文件
|
|
|
|
- *--------------------------------------------------------------*/
|
|
|
|
- bool isNewFile = false;
|
|
|
|
- if(m_writtenSize == 0)
|
|
|
|
- {
|
|
|
|
- /* 如果没有写入过数据,则是新文件 */
|
|
|
|
- isNewFile = true;
|
|
|
|
- m_writtenStartTime = m_srcData.startTime; // 记录开始时间
|
|
|
|
- m_writtenNowTime = m_writtenStartTime; // 记录当前时间
|
|
|
|
- }
|
|
|
|
- /* 设置今日目录 */
|
|
|
|
- if(!setTodayPath(isNewFile))
|
|
|
|
- {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
|
|
+ * 写入报警文件
|
|
|
|
+ *--------------------------------------------------------------*/
|
|
|
|
+
|
|
|
|
|
|
- /* 打开文件 */
|
|
|
|
- QFile wavFile;
|
|
|
|
- if(!openFile(wavFile, isNewFile))
|
|
|
|
- {
|
|
|
|
- if(m_openFileErrorSize >= 3)
|
|
|
|
- {
|
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "{} 打开文件失败次数过多,重新开始记录", m_logBase);
|
|
|
|
- m_writtenSize = 0;
|
|
|
|
- m_writtenStartTime = QDateTime::currentDateTime(); // 重新开始时间
|
|
|
|
- m_writtenNowTime = m_writtenStartTime; // 重新开始时间
|
|
|
|
- m_wavFileName.clear(); // 清空文件名
|
|
|
|
- m_srcData.clear(); // 清空缓冲区数据
|
|
|
|
- m_openFileErrorSize = 0; // 重置错误次数
|
|
|
|
- continue; // 重新开始记录
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- /*--------------------------------------------------------------
|
|
|
|
- * 将数据写入文件,并记录其携带的时间和写入的数据大小
|
|
|
|
- *--------------------------------------------------------------*/
|
|
|
|
- int64_t wSize = 0;
|
|
|
|
- {
|
|
|
|
- std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
|
|
- wSize = wavFile.write(m_srcData.pData, m_srcData.dataSize);
|
|
|
|
- /* 更新结束时间 */
|
|
|
|
- m_writtenNowTime = m_srcData.endTime;
|
|
|
|
- /* 清空缓冲区 */
|
|
|
|
- m_srcData.clear();
|
|
|
|
- }
|
|
|
|
- if(wSize < 0)
|
|
|
|
- {
|
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "{} 写入WAV文件失败: {}", m_logBase, wavFile.errorString().toStdString());
|
|
|
|
- SPDLOG_LOGGER_WARN(m_logger, "文件路径:{}", m_wavFileName.toStdString());
|
|
|
|
- wavFile.close();
|
|
|
|
- continue;
|
|
|
|
- } else {
|
|
|
|
- SPDLOG_LOGGER_TRACE(m_logger, "{} 写入WAV文件成功: {}, 大小: {} 字节", m_logBase, m_wavFileName.toStdString(), wSize);
|
|
|
|
- }
|
|
|
|
- wavFile.close();
|
|
|
|
- // SPDLOG_LOGGER_DEBUG(m_logger, "{} 写入WAV文件完成: {}, 大小: {} 字节",
|
|
|
|
- // m_logBase, m_wavFileName.toStdString(), wSize);
|
|
|
|
-
|
|
|
|
/*--------------------------------------------------------------
|
|
/*--------------------------------------------------------------
|
|
- * 对该文件进行其他操作,判断是否已经过了一个整点,修改其文件名称
|
|
|
|
- * 现在这里的时间是这一分钟的开始时间,现在需要根据开始时间求出已写入
|
|
|
|
- * 数据大小对应的结束时间
|
|
|
|
- *--------------------------------------------------------------*/
|
|
|
|
- m_writtenSize += wSize;
|
|
|
|
-
|
|
|
|
- /* 修改文件名称 */
|
|
|
|
- QString newFileName = generateFileName(m_writtenStartTime, m_writtenNowTime);
|
|
|
|
- if(modifyFileName(m_wavFileName, newFileName))
|
|
|
|
- {
|
|
|
|
- m_wavFileName = newFileName;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* 判断是否过了整点 */
|
|
|
|
- if(isOneHourPassed())
|
|
|
|
- {
|
|
|
|
- /* 修改文件头中记录的数据大小 */
|
|
|
|
- m_wavHeader.setDataSize(m_writtenSize);
|
|
|
|
- m_wavHeader.calculateDerivedFields();
|
|
|
|
- modifyWavFileHeader(m_wavFileName, m_wavHeader);
|
|
|
|
-
|
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "{} 结束记录一个文件: {}, 已写入大小: {} 字节",
|
|
|
|
- m_logBase, m_wavFileName.toStdString(), m_writtenSize);
|
|
|
|
-
|
|
|
|
- /* 重置已写入大小 */
|
|
|
|
- m_writtenSize = 0;
|
|
|
|
- m_writtenStartTime = QDateTime(); // 重新开始时间
|
|
|
|
- m_writtenNowTime = m_writtenStartTime; // 重新开始时间
|
|
|
|
- m_wavFileName.clear(); // 清空文件名
|
|
|
|
- m_openFileErrorSize = 0; // 重置错误次数
|
|
|
|
- }
|
|
|
|
|
|
+ * 写入长记录文件
|
|
|
|
+ *--------------------------------------------------------------*/
|
|
|
|
+ writeLongRecordFile();
|
|
|
|
|
|
}
|
|
}
|
|
SPDLOG_LOGGER_WARN(m_logger, "➢ {} 记录长文件线程结束运行", m_logBase);
|
|
SPDLOG_LOGGER_WARN(m_logger, "➢ {} 记录长文件线程结束运行", m_logBase);
|
|
@@ -239,8 +160,9 @@ bool CreateLongFileThread::initData()
|
|
/* 给缓存分配空间 */
|
|
/* 给缓存分配空间 */
|
|
m_bufferData.allocateMemory(m_writeCriticalSize * 3);
|
|
m_bufferData.allocateMemory(m_writeCriticalSize * 3);
|
|
m_srcData.allocateMemory(m_writeCriticalSize * 3);
|
|
m_srcData.allocateMemory(m_writeCriticalSize * 3);
|
|
- /* 获取记录文件的位置 */
|
|
|
|
- m_recordPath = GInfo.longWavPath();
|
|
|
|
|
|
+
|
|
|
|
+ /* 设置环形队列大小 */
|
|
|
|
+ m_ringQueue.setQueueCapacity(GInfo.queueElementCount());
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -252,29 +174,166 @@ void CreateLongFileThread::clearData()
|
|
m_bufferData.clear();
|
|
m_bufferData.clear();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* 写入长记录文件 */
|
|
|
|
+bool CreateLongFileThread::writeLongRecordFile()
|
|
|
|
+{
|
|
|
|
+ /* 判断缓存是否达到1分钟数据临界值 */
|
|
|
|
+ {
|
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
|
|
+ if(m_bufferData.dataSize < m_writeCriticalSize)
|
|
|
|
+ {
|
|
|
|
+ return true; // 缓存数据不足,继续等待
|
|
|
|
+ }
|
|
|
|
+ /* 数据足够了将缓冲区数据拷贝出来 */
|
|
|
|
+ memcpy(m_srcData.pData, m_bufferData.pData, m_bufferData.dataSize);
|
|
|
|
+ m_srcData.dataSize = m_bufferData.dataSize;
|
|
|
|
+ m_srcData.startTime = m_bufferData.startTime;
|
|
|
|
+ m_srcData.endTime = m_bufferData.endTime;
|
|
|
|
+ /* 清空缓冲区数据 */
|
|
|
|
+ m_bufferData.clear();
|
|
|
|
+ }
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 设置数据,dataSize: {}, startTime: {}, endTime: {}",
|
|
|
|
+ // m_logBase, m_srcData.dataSize, m_srcData.startTime.toString("yyyy-MM-dd hh:mm:ss").toStdString(), m_srcData.endTime.toString("yyyy-MM-dd hh:mm:ss").toStdString());
|
|
|
|
+ /*--------------------------------------------------------------
|
|
|
|
+ * 打开文件。写入的时候判断是否到达了整点,如果到达了整点,则关闭文件
|
|
|
|
+ * 重新创建一个新的文件
|
|
|
|
+ *--------------------------------------------------------------*/
|
|
|
|
+ bool isNewFile = false;
|
|
|
|
+ if(m_writtenSize == 0)
|
|
|
|
+ {
|
|
|
|
+ /* 如果没有写入过数据,则是新文件 */
|
|
|
|
+ isNewFile = true;
|
|
|
|
+ m_writtenStartTime = m_srcData.startTime; // 记录开始时间
|
|
|
|
+ m_writtenNowTime = m_writtenStartTime; // 记录当前时间
|
|
|
|
+ }
|
|
|
|
+ /* 设置今日目录 */
|
|
|
|
+ if(!setTodayPath(isNewFile))
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 打开文件 */
|
|
|
|
+ QFile wavFile;
|
|
|
|
+ if(!openFile(wavFile, isNewFile))
|
|
|
|
+ {
|
|
|
|
+ if(m_openFileErrorSize >= 3)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 打开文件失败次数过多,重新开始记录", m_logBase);
|
|
|
|
+ m_writtenSize = 0;
|
|
|
|
+ m_writtenStartTime = QDateTime::currentDateTime(); // 重新开始时间
|
|
|
|
+ m_writtenNowTime = m_writtenStartTime; // 重新开始时间
|
|
|
|
+ m_wavFileName.clear(); // 清空文件名
|
|
|
|
+ m_srcData.clear(); // 清空缓冲区数据
|
|
|
|
+ m_openFileErrorSize = 0; // 重置错误次数
|
|
|
|
+ return false; // 重新开始记录
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /*--------------------------------------------------------------
|
|
|
|
+ * 将数据写入文件,并记录其携带的时间和写入的数据大小
|
|
|
|
+ *--------------------------------------------------------------*/
|
|
|
|
+ int64_t wSize = 0;
|
|
|
|
+ {
|
|
|
|
+ std::lock_guard<std::mutex> lock(m_mutexBuffer);
|
|
|
|
+ wSize = wavFile.write(m_srcData.pData, m_srcData.dataSize);
|
|
|
|
+ /* 更新结束时间 */
|
|
|
|
+ m_writtenNowTime = m_srcData.endTime;
|
|
|
|
+ /* 清空缓冲区 */
|
|
|
|
+ m_srcData.clear();
|
|
|
|
+ }
|
|
|
|
+ if(wSize < 0)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 写入WAV文件失败: {}", m_logBase, wavFile.errorString().toStdString());
|
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "文件路径:{}", m_wavFileName.toStdString());
|
|
|
|
+ wavFile.close();
|
|
|
|
+ return false;
|
|
|
|
+ } else {
|
|
|
|
+ SPDLOG_LOGGER_TRACE(m_logger, "{} 写入WAV文件成功: {}, 大小: {} 字节", m_logBase, m_wavFileName.toStdString(), wSize);
|
|
|
|
+ }
|
|
|
|
+ wavFile.close();
|
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "{} 写入WAV文件完成: {}, 大小: {} 字节",
|
|
|
|
+ // m_logBase, m_wavFileName.toStdString(), wSize);
|
|
|
|
+
|
|
|
|
+ /*--------------------------------------------------------------
|
|
|
|
+ * 对该文件进行其他操作,判断是否已经过了一个整点,修改其文件名称
|
|
|
|
+ * 现在这里的时间是这一分钟的开始时间,现在需要根据开始时间求出已写入
|
|
|
|
+ * 数据大小对应的结束时间
|
|
|
|
+ *--------------------------------------------------------------*/
|
|
|
|
+ m_writtenSize += wSize;
|
|
|
|
+
|
|
|
|
+ /* 修改文件名称 */
|
|
|
|
+ QString newFileName = generateFileName(m_writtenStartTime, m_writtenNowTime);
|
|
|
|
+ if(modifyFileName(m_wavFileName, newFileName))
|
|
|
|
+ {
|
|
|
|
+ m_wavFileName = newFileName;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 判断是否过了整点 */
|
|
|
|
+ if(isOneHourPassed())
|
|
|
|
+ {
|
|
|
|
+ /* 修改文件头中记录的数据大小 */
|
|
|
|
+ m_wavHeader.setDataSize(m_writtenSize);
|
|
|
|
+ m_wavHeader.calculateDerivedFields();
|
|
|
|
+ modifyWavFileHeader(m_wavFileName, m_wavHeader);
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 结束记录一个文件: {}, 已写入大小: {} 字节",
|
|
|
|
+ m_logBase, m_wavFileName.toStdString(), m_writtenSize);
|
|
|
|
+ /* 重置已写入大小 */
|
|
|
|
+ m_writtenSize = 0;
|
|
|
|
+ m_writtenStartTime = QDateTime(); // 重新开始时间
|
|
|
|
+ m_writtenNowTime = m_writtenStartTime; // 重新开始时间
|
|
|
|
+ m_wavFileName.clear(); // 清空文件名
|
|
|
|
+ m_openFileErrorSize = 0; // 重置错误次数
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
/* 设置今日目录 */
|
|
/* 设置今日目录 */
|
|
bool CreateLongFileThread::setTodayPath(bool isNewFile)
|
|
bool CreateLongFileThread::setTodayPath(bool isNewFile)
|
|
{
|
|
{
|
|
- if(isNewFile)
|
|
|
|
|
|
+ if(!isNewFile)
|
|
{
|
|
{
|
|
- QString todayDirName = QString("%1/%2/Record_%3-%4")
|
|
|
|
- .arg(m_recordPath)
|
|
|
|
- .arg(QDate::currentDate().toString("yyyy-MM-dd"))
|
|
|
|
- .arg(m_threadInfo.cardRoadInfo.strSoundCardID)
|
|
|
|
- .arg(QString::number(m_threadInfo.cardRoadInfo.roadInfo.nRoadNum));
|
|
|
|
- m_todayDir.setPath(todayDirName);
|
|
|
|
- if(!m_todayDir.exists())
|
|
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 判断现在日期是否还是当天日期 */
|
|
|
|
+ QDate today = QDate::currentDate();
|
|
|
|
+ if(m_todayDateRecord == today)
|
|
|
|
+ {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ m_todayDateRecord = today;
|
|
|
|
+ /* 先检查现在的日期文件夹是否存在,因为其他线程可能已经创建了 */
|
|
|
|
+ QString todayDirName = QString("%1/%2").arg(GInfo.longWavPath()).arg(today.toString("yyyy-MM-dd"));
|
|
|
|
+ m_todayDir.setPath(todayDirName);
|
|
|
|
+ if(!m_todayDir.exists())
|
|
|
|
+ {
|
|
|
|
+ if(!m_todayDir.mkpath(todayDirName))
|
|
{
|
|
{
|
|
- if(!m_todayDir.mkpath(todayDirName))
|
|
|
|
- {
|
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "{} 创建目录失败: {}", m_logBase, todayDirName.toStdString());
|
|
|
|
- } else {
|
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "{} 创建目录成功: {}", m_logBase, todayDirName.toStdString());
|
|
|
|
- }
|
|
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 创建今日目录失败: {}", m_logBase, todayDirName.toStdString());
|
|
|
|
+ return false; // 创建目录失败
|
|
|
|
+ } else {
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 创建今日目录成功: {}", m_logBase, todayDirName.toStdString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- return m_todayDir.exists();
|
|
|
|
|
|
+ /* 创建这个通道的文件夹,文件夹格式: AudioPCI-0 */
|
|
|
|
+ QString roadDirName = QString("%1/%2-%3")
|
|
|
|
+ .arg(todayDirName)
|
|
|
|
+ .arg(m_threadInfo.cardRoadInfo.strSoundCardID)
|
|
|
|
+ .arg(QString::number(m_threadInfo.cardRoadInfo.roadInfo.nRoadNum));
|
|
|
|
+ m_todayDir.setPath(roadDirName);
|
|
|
|
+ if(!m_todayDir.exists())
|
|
|
|
+ {
|
|
|
|
+ if(!m_todayDir.mkpath(todayDirName))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 创建目录失败: {}", m_logBase, roadDirName.toStdString());
|
|
|
|
+ return false;
|
|
|
|
+ } else {
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 创建目录成功: {}", m_logBase, roadDirName.toStdString());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
/* 打开文件 */
|
|
/* 打开文件 */
|
|
@@ -339,6 +398,7 @@ QString CreateLongFileThread::generateFileName(const QDateTime& startTime, const
|
|
return m_todayDir.filePath(fileName);
|
|
return m_todayDir.filePath(fileName);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
/* 判断是否过了整点 */
|
|
/* 判断是否过了整点 */
|
|
bool CreateLongFileThread::isOneHourPassed()
|
|
bool CreateLongFileThread::isOneHourPassed()
|
|
{
|
|
{
|
|
@@ -363,3 +423,112 @@ bool CreateLongFileThread::isOneHourPassed()
|
|
return isPassed;
|
|
return isPassed;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+/* 生成报警文件名 */
|
|
|
|
+QString CreateLongFileThread::generateAlarmFileName(const AlarmInfo_t& alarmInfo, bool isNewFile)
|
|
|
|
+{
|
|
|
|
+ QString retFileName;
|
|
|
|
+ if(isNewFile)
|
|
|
|
+ {
|
|
|
|
+ /* 先检查是否已经过了一天了,设置日期文件夹 */
|
|
|
|
+ setTodayAlarmPath();
|
|
|
|
+
|
|
|
|
+ /* 检查这个对比项的报警文件夹是否存在 */
|
|
|
|
+ QString itemDirName = QString("CompareItemID_%1").arg(QString::number(alarmInfo.CompareItemID));
|
|
|
|
+ QDir itemDir = m_todayDirAlarm;
|
|
|
|
+ itemDir.cd(itemDirName);
|
|
|
|
+ if(!itemDir.exists())
|
|
|
|
+ {
|
|
|
|
+ if(!itemDir.mkpath(itemDirName))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 创建报警文件夹失败: {}", m_logBase, itemDirName.toStdString());
|
|
|
|
+ return QString(); // 创建目录失败
|
|
|
|
+ } else {
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 创建报警文件夹成功: {}", m_logBase, itemDirName.toStdString());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /* 生成文件名, 格式: Alarm_RoadNum_AlarmType_yyyyMMdd_hhmmss-yyyyMMdd_hhmmss.wav
|
|
|
|
+ 这里创建的录音文件只有开始日期,没有结束日期,等报警结束之后才会有结束日期 */
|
|
|
|
+ QString fileName = QString("Alarm_%1_%2_%3-.wav")
|
|
|
|
+ .arg(QString::number(alarmInfo.RoadInfo.nCompareRoadNum))
|
|
|
|
+ .arg(getAlarmTypeString(alarmInfo.AlarmType))
|
|
|
|
+ .arg(alarmInfo.StartTime.toString("yyyyMMdd_hhmmss"));
|
|
|
|
+
|
|
|
|
+ /* 拼接文件夹路径 */
|
|
|
|
+ retFileName = itemDir.filePath(fileName);
|
|
|
|
+ }else
|
|
|
|
+ {
|
|
|
|
+ /* 已有的文件,是报警结束的文件名 */
|
|
|
|
+ retFileName = QString::fromStdString(alarmInfo.strAlarmFilePath);
|
|
|
|
+ /* 这里的文件名格式是:Alarm_CompareItemID_RoadNum_AlarmType_yyyyMMdd_hhmmss-yyyyMMdd_hhmmss.wav,
|
|
|
|
+ 这里带上结束时间 */
|
|
|
|
+ QString endTimeStr = alarmInfo.EndTime.toString("yyyyMMdd_hhmmss");
|
|
|
|
+ /* 替换掉原来的结束时间 */
|
|
|
|
+ retFileName.replace("-.wav", QString("-%1.wav").arg(endTimeStr));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return retFileName;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* 写入报警文件 */
|
|
|
|
+void CreateLongFileThread::writeAlarmFile()
|
|
|
|
+{
|
|
|
|
+ /* 先判断环形队列中数据是否足够的秒数,不一定是每一秒都会写的 */
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* 设置今日报警文件夹 */
|
|
|
|
+bool CreateLongFileThread::setTodayAlarmPath()
|
|
|
|
+{
|
|
|
|
+ /* 先检查当天日期文件夹是否存在,因为其他线程可能已经创建了 */
|
|
|
|
+ QDate today = QDate::currentDate();
|
|
|
|
+ if(today == m_todayDateAlarm)
|
|
|
|
+ {
|
|
|
|
+ return true; // 今天的目录已经存在
|
|
|
|
+ }
|
|
|
|
+ m_todayDateAlarm = today;
|
|
|
|
+ /* 创建今日报警目录 */
|
|
|
|
+ /* 格式: Application/2025-07-21 */
|
|
|
|
+ QString todayDirName = QString("%1/%2").arg(GInfo.alarmWavPath()).arg(today.toString("yyyy-MM-dd"));
|
|
|
|
+ m_todayDirAlarm.setPath(todayDirName);
|
|
|
|
+ if(!m_todayDirAlarm.exists())
|
|
|
|
+ {
|
|
|
|
+ if(!m_todayDirAlarm.mkpath(todayDirName))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 创建今日报警目录失败: {}", m_logBase, todayDirName.toStdString());
|
|
|
|
+ return false; // 创建目录失败
|
|
|
|
+ } else {
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "{} 创建今日报警目录成功: {}", m_logBase, todayDirName.toStdString());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* 设置目录 */
|
|
|
|
+ m_todayDirAlarm.setPath(todayDirName);
|
|
|
|
+ QString yesterdayDirName = QString("%1/%2").arg(GInfo.alarmWavPath()).arg(QDate::currentDate().addDays(-1).toString("yyyy-MM-dd"));
|
|
|
|
+ m_yesterdayDir.setPath(yesterdayDirName);
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* 根据报警类型的枚举获取字符 */
|
|
|
|
+QString CreateLongFileThread::getAlarmTypeString(EAlarmType type) const
|
|
|
|
+{
|
|
|
|
+ switch(type)
|
|
|
|
+ {
|
|
|
|
+ case EAlarmType::EAT_Silent:
|
|
|
|
+ return "Silent";
|
|
|
|
+ case EAlarmType::EAT_Overload:
|
|
|
|
+ return "Overload";
|
|
|
|
+ case EAlarmType::EAT_Reversed:
|
|
|
|
+ return "Reversed";
|
|
|
|
+ case EAlarmType::EAR_Consistency:
|
|
|
|
+ return "Consistency";
|
|
|
|
+ case EAlarmType::EAT_Noise:
|
|
|
|
+ return "Noise";
|
|
|
|
+ default:
|
|
|
|
+ return "Unknown";
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|