#include "HxDataBase.h" #include "HxUtils.h" QMutex HxDataBase::mutex; QSqlDatabase HxDataBase::database; QString HxDataBase::device_id; int HxDataBase::recording_prepend_time; QString HxDataBase::ftp_address, HxDataBase::ftp_username, HxDataBase::ftp_password; QString HxDataBase::qamqp_address, HxDataBase::qamqp_username, HxDataBase::qamqp_password; int HxDataBase::algorithm_type; QString HxDataBase::dsm_video_input_source; QString HxDataBase::adas_video_input_source; QStringList HxDataBase::bsd_video_input_source; QStringList HxDataBase::bsd_warn_regions; EventWarnParamConfig HxDataBase::warm_param_config; CameraCalibration HxDataBase::adas_camera_calibration; QStringList HxDataBase::alarm_protect_timestamp; QSqlDatabase HxDataBase::open(QString filepath, QString connectionName) { QSqlDatabase db; if (QSqlDatabase::contains(connectionName)) db = QSqlDatabase::database(connectionName); else db = QSqlDatabase::addDatabase("QSQLITE", connectionName); db.setDatabaseName(filepath); if (!db.open()) { QString bk_filepath = filepath + QString(".[%1].bk").arg(QDateTime::currentDateTime().toString("yyyyMMddHHmmss")); QFile::copy(filepath, bk_filepath); QFile::remove(filepath); db.open(); } return db; } /** * @brief 关闭数据库 * @param connectionName 连接名 */ void HxDataBase::close(QString connectionName) { QSqlDatabase::removeDatabase(connectionName); } /** * @brief 读取 Setting 表数据 * @param name name字段值 * @return 返回对应参数 */ QVariant HxDataBase::read_setting(QString name) { QVariant value; QMutexLocker lock(&mutex); QSqlQuery query(database); query.prepare("SELECT [value] FROM [Setting] WHERE [name]=:name"); query.bindValue(":name", name); if (query.exec()) { if (query.next()) value = query.value("value"); } query.clear(); return value; } /** * @brief 读取 Setting 表数据(int) * @param name name字段值 * @param defaultValue 默认值(int) * @return 返回对应参数(int) */ int HxDataBase::read_setting(QString name, int defaultValue) { auto value = read_setting(name); return value.isNull() ? defaultValue : value.toInt(); } /** * @brief 读取 Setting 表数据(bool) * @param name name字段值 * @param defaultValue 默认值(bool) * @return 返回对应参数(bool) */ bool HxDataBase::read_setting(QString name, bool defaultValue) { auto value = read_setting(name); return value.isNull() ? defaultValue : value.toBool(); } /** * @brief 读取 Setting 表数据(string) * @param name name字段值 * @param defaultValue 默认值(string) * @return 返回对应参数(string) */ QString HxDataBase::read_setting(QString name, QString defaultValue) { auto value = read_setting(name); return value.isNull() ? defaultValue : value.toString(); } /** * @brief 写入 Setting 表数据 * @param name name字段值 * @param value 对应参数 */ void HxDataBase::write_setting(QString name, QString value) { QMutexLocker lock(&mutex); QSqlQuery query(database); query.prepare("REPLACE INTO [Setting] ([name], [value]) VALUES (:name, :value);"); query.bindValue(":name", name); query.bindValue(":value", value); if (!query.exec()) { qDebug("write_setting failed, name=%s, value=%s", name.toUtf8().data(), value.toUtf8().data()); } query.clear(); } void HxDataBase::read_warm_param_config(void) { auto start_event_warn_kind = read_setting("start_event_warn_kind", QString("1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1")).split(";"); auto abnormal_warn_frame_count = read_setting("abnormal_warn_frame_count", QString("0;0;0;0;0;0;0;50;75;25;50;75;50;50;50;25;75;50;50;50;50;50;75;50;50;100")).split(";"); auto normal_frame_count = read_setting("normal_frame_count", QString("0;0;0;0;0;0;0;25;25;25;25;25;25;25;25;25;25;25;25;25;25;25;0;0;0;0")).split(";"); auto abnormal_warn_interval_frame_count = read_setting("abnormal_warn_interval_frame_count", QString("0;0;125;0;125;0;0;0;0;0;0;0;0;125;0;0;0;0;0;0;0;0;0;0;0;0")).split(";"); auto abnormal_warn_score_threshold = read_setting("abnormal_warn_score_threshold", QString("0;0;0;0;0;0;0;0.7;0.8;0.4;0.65;0.95;0.75;0.3;0.65;0.5;0.87;25;25;20;15;0.75;0.3;0.5;0.5;0.5")).split(";"); auto normal_warn_score_threshold = read_setting("normal_warn_score_threshold", QString("0;0;0;0;0;0;0;0.35;0.35;0.7;0.7;0.7;0.55;0.8;0.4;0.55;0.13;20;20;15;10;0.55;0.3;0.3;0.5;0.5")).split(";"); for (int i = 0; i < EVENT_WARN_NUM; i++) { warm_param_config.bStartEventWarnKind[i] = QVariant(start_event_warn_kind.at(i)).toBool(); warm_param_config.nAbnormalWarnFrameCount[i] = abnormal_warn_frame_count.at(i).toInt(); warm_param_config.nNormalFrameCount[i] = normal_frame_count.at(i).toInt(); warm_param_config.nAbnormalWarnIntervalFrameCount[i] = abnormal_warn_interval_frame_count.at(i).toInt(); warm_param_config.fAbnormalWarnScoreThreshold[i] = abnormal_warn_score_threshold.at(i).toFloat(); warm_param_config.fNormalWarnScoreThreshold[i] = normal_warn_score_threshold.at(i).toFloat(); } warm_param_config.nHmwTime = read_setting("hmw_time", 1200); warm_param_config.nPcwTime = read_setting("pcw_time", 2000); warm_param_config.nFcwTime = read_setting("fcw_time", 2400); warm_param_config.fHmwVel = read_setting("hmw_vel", 30); warm_param_config.fFcwVel = read_setting("fcw_vel", 30); warm_param_config.fLdwVel = read_setting("ldw_vel", 55); warm_param_config.fPcwVel = read_setting("pcw_vel", 50); warm_param_config.fBsdFirstVel = read_setting("bsd_first_vel", 30); warm_param_config.fBsdSecondVel = read_setting("bsd_second_vel", 30); warm_param_config.fBsdThirdVel = read_setting("bsd_third_vel", 30); warm_param_config.nLdwDistance = read_setting("ldw_distance", -5); warm_param_config.fDsmVel = read_setting("dsm_vel", 5); } void HxDataBase::write_warm_param_config(void) { QStringList start_event_warn_kind, abnormal_warn_frame_count, normal_frame_count, abnormal_warn_interval_frame_count, abnormal_warn_score_threshold, normal_warn_score_threshold; for (int i = 0; i < EVENT_WARN_NUM; i++) { start_event_warn_kind.append(QString::number(warm_param_config.bStartEventWarnKind[i])); abnormal_warn_frame_count.append(QString::number(warm_param_config.nAbnormalWarnFrameCount[i])); normal_frame_count.append(QString::number(warm_param_config.nNormalFrameCount[i])); abnormal_warn_interval_frame_count.append(QString::number(warm_param_config.nAbnormalWarnIntervalFrameCount[i])); abnormal_warn_score_threshold.append(QString::number(warm_param_config.fAbnormalWarnScoreThreshold[i])); normal_warn_score_threshold.append(QString::number(warm_param_config.fNormalWarnScoreThreshold[i])); } write_setting("start_event_warn_kind", start_event_warn_kind.join(";")); write_setting("abnormal_warn_frame_count", abnormal_warn_frame_count.join(";")); write_setting("normal_frame_count", normal_frame_count.join(";")); write_setting("abnormal_warn_interval_frame_count", abnormal_warn_interval_frame_count.join(";")); write_setting("abnormal_warn_score_threshold", abnormal_warn_score_threshold.join(";")); write_setting("normal_warn_score_threshold", normal_warn_score_threshold.join(";")); write_setting("hmw_time", QString::number(warm_param_config.nHmwTime)); write_setting("pcw_time", QString::number(warm_param_config.nPcwTime)); write_setting("fcw_time", QString::number(warm_param_config.nFcwTime)); write_setting("hmw_vel", QString::number(warm_param_config.fHmwVel)); write_setting("fcw_vel", QString::number(warm_param_config.fFcwVel)); write_setting("ldw_vel", QString::number(warm_param_config.fLdwVel)); write_setting("pcw_vel", QString::number(warm_param_config.fPcwVel)); write_setting("bsd_first_vel", QString::number(warm_param_config.fBsdFirstVel)); write_setting("bsd_second_vel", QString::number(warm_param_config.fBsdSecondVel)); write_setting("bsd_third_vel", QString::number(warm_param_config.fBsdThirdVel)); write_setting("ldw_distance", QString::number(warm_param_config.nLdwDistance)); write_setting("dsm_vel", QString::number(warm_param_config.fDsmVel)); } void HxDataBase::read_adas_camera_calibration(void) { auto value = read_setting("adas_camera_calibration", QString("4527;1830;0;1695;0;1500;6.00;0.00;-0.32;0.00")).split(";"); adas_camera_calibration.fCarLen = value[0].toInt(); adas_camera_calibration.fCarWidth = value[1].toInt(); adas_camera_calibration.fRefCenter = value[2].toInt(); adas_camera_calibration.fRefTop = value[3].toInt(); adas_camera_calibration.fDisLen2Tyre = value[4].toInt(); adas_camera_calibration.fCameraHeight = value[5].toInt(); adas_camera_calibration.fCameraFocus = value[6].toFloat(); adas_camera_calibration.fCameraDx = value[7].toFloat(); adas_camera_calibration.fPitch = value[8].toFloat(); adas_camera_calibration.fYaw = value[9].toFloat(); } void HxDataBase::write_adas_camera_calibration(void) { QStringList value; value.append(QString::number(adas_camera_calibration.fCarLen)); value.append(QString::number(adas_camera_calibration.fCarWidth)); value.append(QString::number(adas_camera_calibration.fRefCenter)); value.append(QString::number(adas_camera_calibration.fRefTop)); value.append(QString::number(adas_camera_calibration.fDisLen2Tyre)); value.append(QString::number(adas_camera_calibration.fCameraHeight)); value.append(QString::number(adas_camera_calibration.fCameraFocus, 'f', 2)); value.append(QString::number(adas_camera_calibration.fCameraDx, 'f', 2)); value.append(QString::number(adas_camera_calibration.fPitch, 'f', 2)); value.append(QString::number(adas_camera_calibration.fYaw, 'f', 2)); write_setting("adas_camera_calibration", value.join(";")); } void HxDataBase::initialization() { database = open("DataBase.db", "DataBase"); if (!database.isOpen()) { qDebug("配置信息创建失败, 程序无法继续启动!"); return; } QSqlQuery query(database); /* 创建 程序配置信息 表 */ if (!query.exec("CREATE TABLE IF NOT EXISTS [Setting] (" " [name] TEXT NOT NULL PRIMARY KEY," " [value] TEXT" ");")) { HxLog::append("database", "setting read failed"); return; } /* 设备编号 */ device_id = read_setting("device_id", QString("TVIS")); /* 预录时长 Seconds */ recording_prepend_time = read_setting("recording_prepend_time", 5); /* FTP信息 */ ftp_address = read_setting("ftp_address", QString("192.168.10.10:7616")); ftp_username = read_setting("ftp_username", QString("nvruser")); ftp_password = read_setting("ftp_password", QString("Sztvis_789.")); /* */ qamqp_address = read_setting("qamqp_address", QString("192.168.1.227:5672")); qamqp_username = read_setting("qamqp_username", QString("root")); qamqp_password = read_setting("qamqp_password", QString("Sztvis@789.")); /* 算法类型, 默认 BSD */ algorithm_type = read_setting("algorithm_type", 0x01); /* DSM 视频输入源 (string) */ dsm_video_input_source = read_setting("dsm_video_input_source", QString("")); /* Adas 视频输入源 (string) */ adas_video_input_source = read_setting("adas_video_input_source", QString("")); /* BSD 视频输入源 (string) */ bsd_video_input_source = read_setting("bsd_video_input_source", QString(";;;;;;")).split(";"); /* BSD 报警区域 */ bsd_warn_regions = read_setting( "bsd_warn_regions", QString("0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*" "0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*" "0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*" "0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*" "0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*" "0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0")) .split("*"); /* 读取报警参数配置 */ read_warm_param_config(); /* 读取 ADAS 相机内外参 */ read_adas_camera_calibration(); /* 报警保护时长 */ alarm_protect_timestamp = read_setting("alarm_protect_timestamp", QString("3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3")).split(";"); } bool HxDataBase::save_setting() { database.transaction(); write_setting("device_id", device_id); write_setting("recording_prepend_time", QString::number(recording_prepend_time)); write_setting("ftp_address", ftp_address); write_setting("ftp_username", ftp_username); write_setting("ftp_password", ftp_password); write_setting("qamqp_address", qamqp_address); write_setting("qamqp_username", qamqp_username); write_setting("qamqp_password", qamqp_password); write_setting("algorithm_type", QString::number(algorithm_type)); write_setting("dsm_video_input_source", dsm_video_input_source); write_setting("adas_video_input_source", adas_video_input_source); write_setting("bsd_video_input_source", bsd_video_input_source.join(";")); write_setting("bsd_warn_regions", bsd_warn_regions.join("*")); write_warm_param_config(); write_adas_camera_calibration(); write_setting("alarm_protect_timestamp", alarm_protect_timestamp.join(";")); return database.commit(); } /** * @brief 获取BSD报警区域 * @param channel 通道号 * @return 返回 BsdWarnRegion 结构体 */ BsdWarnRegion HxDataBase::get_bsd_warn_region(int channel) { BsdWarnRegion ret; auto data = bsd_warn_regions[channel]; if (data == "") data = "0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0"; auto array = data.split("$"); auto points = array[0].split(" "); for (int a = 0; a < 4; a++) { auto p = points.at(a).split(","); ret.tFirstRegionPoint[a].x = p[0].toInt(); ret.tFirstRegionPoint[a].y = p[1].toInt(); } points = array[1].split(" "); for (int a = 0; a < 4; a++) { auto p = points.at(a).split(","); ret.tSecondRegionPoint[a].x = p[0].toInt(); ret.tSecondRegionPoint[a].y = p[1].toInt(); } points = array[2].split(" "); for (int a = 0; a < 4; a++) { auto p = points.at(a).split(","); ret.tThirdRegionPoint[a].x = p[0].toInt(); ret.tThirdRegionPoint[a].y = p[1].toInt(); } return ret; }