RecordControlApplication/main.cpp

192 lines
4.9 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "Channel.h"
#include "CheckStorageThread.h"
#include "Constant.h"
#include "Json.h"
#include "Link.h"
#include "Log.h"
#include "SerialPortTool.h"
#include "TcpServer.h"
#include "Tool.h"
#include "Widget.h"
#include <QApplication>
#include <unistd.h>
// Tcp服务器
TcpServer* server;
// 串口工具
SerialPortTool* serialPortTool;
// 视频输出通道
LinkObject* vo;
LinkObject* vo1;
// 通道列表
QList<Channel*> channelList;
// 录制模式
Constant::RecordMode recordMode;
// 回放模式
Constant::PlaybackMode playbackMode;
/**
* @brief 加载配置文件
*/
bool loadConfiguration(QString path)
{
QFileInfo fileInfo(path);
if (!fileInfo.exists()) {
Log::critical("config.json does not exist, exit");
return false;
}
QVariantMap config = Json::loadFile(path).toMap();
recordMode = Constant::RecordMode(config["recordMode"].toInt());
playbackMode = Constant::PlaybackMode(config["playbackMode"].toInt());
QVariantList list = config["interface"].toList();
for (int i = 0; i < list.count(); i++) {
Channel* chn = new Channel();
QVariantMap cfg = list.at(i).toMap();
chn->channelName = cfg["name"].toString();
QVariantMap encV = cfg["encV"].toMap();
chn->videoEncoderParams = encV;
QVariantMap encA = cfg["encA"].toMap();
chn->audioEncoderParams = encA;
chn->pushCode = cfg["pushCode"].toString();
chn->init();
channelList.push_back(chn);
}
return true;
}
/**
* @brief 开始录制
*/
void startRecord()
{
// 判断是否挂载了磁盘
QString info = Tool::writeCom(QString("df %1").arg(Constant::MountedPath));
if (!info.contains(Constant::MountedPath)) {
Log::error("there is no disk mounted");
return;
}
// 一路录制只录制HDMI-A通道
if (recordMode == Constant::OneChannelRecord) {
for (Channel* chn : channelList) {
if (chn->channelName == Constant::MainChannel) {
chn->startRecord();
// 打开录制灯,关闭环路灯
serialPortTool->onRecordStart();
serialPortTool->onLoopOff();
}
}
}
// 两路录制
else if (recordMode == Constant::TwoChannelRecord) {
for (Channel* chn : channelList) {
chn->startRecord();
// 打开录制灯,关闭环路灯
serialPortTool->onRecordStart();
serialPortTool->onLoopOff();
}
}
// 无录制
else {
// 打开环路灯
serialPortTool->onLoopOn();
}
}
int main(int argc, char* argv[])
{
// 初始化日志
Log::init();
// 初始化Link编码系统
if (!Link::init()) {
Log::error("Link init failed, exit");
return 0;
}
// 在初始化QApplication之前初始化视频输出和linuxfb
// 否则不能显示qt的ui
// HDMI-OUT0视频输出只将ui输出在0口
vo = Link::create("OutputVo");
QVariantMap dataVo;
dataVo["vid"] = 0;
dataVo["type"] = "hdmi";
vo->start(dataVo);
// HDMI-OUT1视频输出
vo1 = Link::create("OutputVo");
QVariantMap dataVo1;
dataVo1["vid"] = 1;
dataVo1["ui"] = false;
dataVo1["type"] = "vga|bt1120";
vo1->start(dataVo1);
/**
* 后续可能需要进行修改**************************
*/
// HDMI-OUT1口特殊设置
static int lastNorm = 0;
int norm = 0;
QString str = "1080P60";
if (str == "1080P60")
norm = 9;
else if (str == "1080P50")
norm = 10;
else if (str == "1080P30")
norm = 12;
else if (str == "720P60")
norm = 5;
else if (str == "720P50")
norm = 6;
else if (str == "3840x2160_30")
norm = 14;
if (norm != lastNorm) {
lastNorm = norm;
QString cmd = "rmmod hi_lt8618sx_lp.ko";
system(cmd.toLatin1().data());
cmd = "insmod /ko/extdrv/hi_lt8618sx_lp.ko norm=" + QString::number(norm);
system(cmd.toLatin1().data());
}
QApplication a(argc, argv);
// 初始化配置文件, 需要在QApplication之后
if (!loadConfiguration(Constant::ConfigurationPath)) {
Log::error("load configuration failed, exit...");
return 0;
}
// 串口
serialPortTool = new SerialPortTool();
serialPortTool->open();
// 打开电源灯
serialPortTool->onPowerOn();
// qt界面
Widget w;
w.show();
// 开始录制
startRecord();
// 开启Tcp服务
server = new TcpServer();
server->listen();
// 硬盘检测线程,检测硬盘容量
CheckStorageThread* thread = new CheckStorageThread();
thread->start();
QObject::connect(thread, SIGNAL(diskWillFull()), serialPortTool, SLOT(onDiskWillFull()));
QObject::connect(thread, SIGNAL(diskNotFull()), serialPortTool, SLOT(onDiskNotFull()));
Log::info("start storage check thread...");
return a.exec();
}