119 lines
3.8 KiB
C++
119 lines
3.8 KiB
C++
#include "mainwindow.h"
|
|
#include "appcontext.h"
|
|
#include "car.h"
|
|
#include "confirmdialog.h"
|
|
|
|
#include "base.h"
|
|
#include "bootpassword.h"
|
|
#include "warning.h"
|
|
#include "passwordmgmtlogin.h"
|
|
#include "passwordmgmt.h"
|
|
#include "passwordreset.h"
|
|
#include "selfcheck.h"
|
|
#include "home.h"
|
|
#include "jobselect.h"
|
|
#include "chassis.h"
|
|
#include "arm.h"
|
|
#include "gasdetector.h"
|
|
#include "washpage.h"
|
|
#include "debugmaintain.h"
|
|
#include "faultquery.h"
|
|
|
|
#include <QStackedWidget>
|
|
#include <QLabel>
|
|
#include <QVBoxLayout>
|
|
|
|
MainWindow::MainWindow(QWidget* parent)
|
|
: QMainWindow(parent)
|
|
{
|
|
m_ctx = AppContext::instance();
|
|
|
|
setWindowTitle("玉兔工业无线遥控器");
|
|
setWindowFlags(Qt::FramelessWindowHint | Qt::Window);
|
|
setFixedSize(SCREEN_W, SCREEN_H);
|
|
|
|
// 中央堆栈
|
|
m_stack = new QStackedWidget(this);
|
|
m_stack->setObjectName("StackedWidget");
|
|
setCentralWidget(m_stack);
|
|
|
|
buildPages();
|
|
|
|
// 全局急停横幅(覆盖于页面之上):仅作提示。
|
|
// 急停与复位都由遥控器 bit4 下发,面板不提供复位控件。
|
|
m_estopBanner = new QLabel("急停已触发,请用遥控器复位!", this);
|
|
m_estopBanner->setAlignment(Qt::AlignCenter);
|
|
m_estopBanner->setStyleSheet(
|
|
"background-color:#E5484D;color:#FFFFFF;font-size:50px;font-weight:700;");
|
|
m_estopBanner->setGeometry(0, 98, SCREEN_W, 64);
|
|
m_estopBanner->hide();
|
|
|
|
connect(m_ctx, &AppContext::estopChanged, this, &MainWindow::onEstopChanged);
|
|
|
|
// 启动通信层(UDP 收包发包)
|
|
m_ctx->comm()->start();
|
|
m_ctx->rc()->start(); // 遥控器接收(独立端口)
|
|
|
|
// 初始页面:开机密码 →(验证通过)自检 →(自检结束)系统首页面
|
|
m_stack->setCurrentIndex(PageBoot);
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
}
|
|
|
|
void MainWindow::buildPages()
|
|
{
|
|
m_pages.fill(nullptr, PageCount);
|
|
|
|
auto add = [this](PageId id, BasePage* p) {
|
|
m_pages[id] = p;
|
|
m_stack->addWidget(p);
|
|
connect(p, &BasePage::navigate, this, &MainWindow::onNavigate);
|
|
};
|
|
|
|
add(PageBoot, new BootPasswordPage(m_ctx));
|
|
add(PageWarning, new WarningPage(m_ctx));
|
|
add(PageMgmtLogin, new PasswordMgmtLoginPage(m_ctx));
|
|
add(PageMgmt, new PasswordMgmtPage(m_ctx));
|
|
add(PageReset, new PasswordResetPage(m_ctx));
|
|
add(PageSelfCheck, new SelfCheckPage(m_ctx));
|
|
add(PageHome, new HomePage(m_ctx));
|
|
add(PageJob, new JobSelectPage(m_ctx));
|
|
add(PageChassis, new ChassisPage(m_ctx));
|
|
add(PageArm, new ArmPage(m_ctx));
|
|
add(PageGas, new GasDetectorPage(m_ctx));
|
|
add(PageClean, new WashPage(m_ctx, WashPage::Clean));
|
|
add(PageDisinfect, new WashPage(m_ctx, WashPage::Disinfect));
|
|
add(PageDebug, new DebugMaintainPage(m_ctx));
|
|
add(PageFault, new FaultQueryPage(m_ctx));
|
|
|
|
m_faultPage = qobject_cast<FaultQueryPage*>(page(PageFault));
|
|
m_debugPage = qobject_cast<DebugMaintainPage*>(page(PageDebug));
|
|
}
|
|
|
|
void MainWindow::onNavigate(PageId id)
|
|
{
|
|
// 记录故障查询返回来源(自检页 / 系统首页面 进入时原路返回,其它一律回作业选择页)
|
|
if (id == PageFault && m_faultPage) {
|
|
PageId cur = static_cast<PageId>(m_stack->currentIndex());
|
|
if (cur == PageSelfCheck || cur == PageHome)
|
|
m_faultPage->setReturnPage(cur);
|
|
else
|
|
m_faultPage->setReturnPage(PageJob);
|
|
}
|
|
// 调试维护有两个入口(系统首页 / 作业选择),同样原路返回
|
|
if (id == PageDebug && m_debugPage) {
|
|
PageId cur = static_cast<PageId>(m_stack->currentIndex());
|
|
m_debugPage->setReturnPage(cur == PageHome ? PageHome : PageJob);
|
|
}
|
|
if (id >= 0 && id < PageCount)
|
|
m_stack->setCurrentIndex(id);
|
|
}
|
|
|
|
void MainWindow::onEstopChanged(bool triggered)
|
|
{
|
|
m_estopBanner->setVisible(triggered);
|
|
m_estopBanner->raise();
|
|
}
|