卫星终端控制软件_V1.0.3

1、增加北斗RDSS卫星状态显示;
2、修改模组状态/信号强度/注M状态/入网状态图标显示
3、增加转台状态显示
4、增加参数配置功能
5、解决通话时间显示上一次市场的问题
6、解决来电号码为00字符的问题
This commit is contained in:
lz
2025-10-14 09:05:01 +08:00
parent ff523d3db3
commit fc92b31bed
35 changed files with 1326 additions and 238 deletions

View File

@@ -30,6 +30,8 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
LoggerWidget.h LoggerWidget.cpp LoggerWidget.ui
msg.h
msg.cpp
ConfigParam.h ConfigParam.cpp ConfigParam.ui
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET Satellite APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR

142
ConfigParam.cpp Normal file
View File

@@ -0,0 +1,142 @@
#include "ConfigParam.h"
#include "ui_ConfigParam.h"
#include "msg.h"
#include <QMessageBox>
ConfigParam::ConfigParam(QWidget *parent)
: QWidget(parent)
, ui(new Ui::ConfigParam)
{
ui->setupUi(this);
}
ConfigParam::~ConfigParam()
{
delete ui;
}
bool ConfigParam::checkNumber(char type, const QString& number){
if (number.isEmpty()) {
QMessageBox::information(this, "错误", QString("请输入%1电话号码").arg(QChar(type)));
return false;
}
// 检查号码是否只包含数字 0-9
QRegularExpression digitOnly("^[0-9]*$"); // 正则表达式:只允许数字
if (!digitOnly.match(number).hasMatch()) {
QMessageBox::information(this, "错误", QString("%1电话号码只能包含数字0-9").arg(QChar(type)));
return false;
}
//检查号码长度
if (number.size() > 20){
QMessageBox::information(this, "错误", QString("%1电话号码长度不能超过20").arg(QChar(type)));
return false;
}
// TODO: 检查电话号码格式是否满足要求
return true;
}
void ConfigParam::on_btnGetDefaultChannelAndNumber_clicked()
{
emit sendUdpRequest(pack_config_cmd_DefaultChannelAndNumberGet());
}
void ConfigParam::on_btnSetDefaultChannelAndNumber_clicked()
{
uint8_t channelType = ui->defaultChannelType->currentIndex();
if(channelType == 0)
{
QMessageBox::information(this, "错误", "请选择默认话音通道");
return;
}
// 检查电话号码是否为空
QString u_number = ui->uDefaultNum->text();
if(!checkNumber('U', u_number)){
return;
}
QString s_number = ui->sDefaultNum->text();
if(!checkNumber('S', s_number)){
return;
}
emit sendUdpRequest(pack_config_cmd_DefaultChannelAndNumberSet((channelType - 1), u_number.toStdString(), s_number.toStdString()));
}
void ConfigParam::on_btnGetUDataChannelKeepTime_clicked()
{
emit sendUdpRequest(pack_config_cmd_UDataChannelKeepTimeGet());
}
void ConfigParam::on_btnSetUDataChannelKeepTime_clicked()
{
bool result;
QString keeptime = ui->uDataChannelKeepTime->text();
if (keeptime.isEmpty()) {
QMessageBox::information(this, "错误", "U数据通道保持时间不能为空");
return;
}
int keeptimeValue = keeptime.toInt(&result);
if(!result || (keeptimeValue < 0) || (keeptimeValue > 65535))
{
QMessageBox::information(this, "错误", "U数据通道保持时间参数错误,取值范围为0~65535");
return;
}
emit sendUdpRequest(pack_config_cmd_UDataChannelKeepTimeSet(keeptimeValue));
}
void ConfigParam::processConfigCmd(const QByteArray& cmd){
switch(uint8_t(cmd[COMMAND_TYPE_INDEX])){
case uint8_t(CommandType::kConfigCmdDefaultChannelAndNumber):
if(cmd[SUB_COMMAND_TYPE_INDEX] == uint8_t(ConfigCommandType::kGetType))
{
int data_index = COMMAND_DATA_BEGIN_INDEX;
uint8_t channelType = cmd[data_index++];//通道类型
ui->defaultChannelType->setCurrentIndex(channelType + 1);
// U号码,使用 QByteArray 处理
QByteArray u_data = QByteArray::fromRawData(cmd.constData() + data_index, 20);
u_data.replace('\0', ""); // 移除所有空字符
// 转换为 std::string
std::string u_number = u_data.toStdString();
data_index += 20;
// S号码,使用 QByteArray 处理
QByteArray s_data = QByteArray::fromRawData(cmd.constData() + data_index, 20);
s_data.replace('\0', ""); // 移除所有空字符
// 转换为 std::string
std::string s_number = s_data.toStdString();
data_index += 20;
ui->uDefaultNum->setText(QString::fromStdString(u_number));
ui->sDefaultNum->setText(QString::fromStdString(s_number));
}
else if(cmd[SUB_COMMAND_TYPE_INDEX] == uint8_t(ConfigCommandType::kSetType))
{
if(cmd[COMMAND_DATA_BEGIN_INDEX] == uint8_t(VoiceAndShortMessageReponse::kSucess)){//设置成功
QMessageBox::information(this, "提示", "默认话音通道与电话号码设置成功");
}else if(cmd[COMMAND_DATA_BEGIN_INDEX] == uint8_t(VoiceAndShortMessageReponse::kFailure)){//设置失败
QMessageBox::information(this, "提示", "默认话音通道与电话号码设置失败");
}
}
break;
case uint8_t(CommandType::kConfigCmdUDataChannelKeepTime):
if(cmd[SUB_COMMAND_TYPE_INDEX] == uint8_t(ConfigCommandType::kGetType))
{
uint16_t keeptime = ((uint16_t)cmd[COMMAND_DATA_BEGIN_INDEX] << 8) | cmd[COMMAND_DATA_BEGIN_INDEX + 1];
ui->uDataChannelKeepTime->setText(QString("%1").arg(keeptime));
}
else if(cmd[SUB_COMMAND_TYPE_INDEX] == uint8_t(ConfigCommandType::kSetType))
{
if(cmd[COMMAND_DATA_BEGIN_INDEX] == uint8_t(VoiceAndShortMessageReponse::kSucess)){//设置成功
QMessageBox::information(this, "提示", "U数据通道保持时间设置成功");
}else if(cmd[COMMAND_DATA_BEGIN_INDEX] == uint8_t(VoiceAndShortMessageReponse::kFailure)){//设置失败
QMessageBox::information(this, "提示", "U数据通道保持时间设置失败");
}
}
break;
}
}

37
ConfigParam.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef CONFIGPARAM_H
#define CONFIGPARAM_H
#include <QWidget>
namespace Ui {
class ConfigParam;
}
class ConfigParam : public QWidget
{
Q_OBJECT
public:
explicit ConfigParam(QWidget *parent = nullptr);
~ConfigParam();
void processConfigCmd(const QByteArray& cmd);
signals:
void sendUdpRequest(const QByteArray &message);
private slots:
void on_btnGetDefaultChannelAndNumber_clicked();
void on_btnSetDefaultChannelAndNumber_clicked();
void on_btnGetUDataChannelKeepTime_clicked();
void on_btnSetUDataChannelKeepTime_clicked();
private:
Ui::ConfigParam *ui;
bool checkNumber(char type, const QString& number);
};
#endif // CONFIGPARAM_H

221
ConfigParam.ui Normal file
View File

@@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ConfigParam</class>
<widget class="QWidget" name="ConfigParam">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>参数配置</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="4">
<widget class="QPushButton" name="btnGetUDataChannelKeepTime">
<property name="text">
<string>查 询</string>
</property>
</widget>
</item>
<item row="2" column="5">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>84</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="2">
<widget class="QLineEdit" name="uDataChannelKeepTime">
<property name="whatsThis">
<string/>
</property>
<property name="placeholderText">
<string/>
</property>
</widget>
</item>
<item row="0" column="5">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>84</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>U数据通道保持时间</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="2">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>185</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="4">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>84</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="5">
<widget class="QPushButton" name="btnSetDefaultChannelAndNumber">
<property name="text">
<string>设 置</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="btnGetDefaultChannelAndNumber">
<property name="text">
<string>查 询</string>
</property>
</widget>
</item>
<item row="0" column="4">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>84</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="5">
<widget class="QPushButton" name="btnSetUDataChannelKeepTime">
<property name="text">
<string>设 置</string>
</property>
</widget>
</item>
<item row="1" column="6">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="2">
<widget class="QLineEdit" name="sDefaultNum">
<property name="whatsThis">
<string/>
</property>
<property name="placeholderText">
<string/>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLineEdit" name="uDefaultNum">
<property name="whatsThis">
<string/>
</property>
<property name="placeholderText">
<string/>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="defaultChannelType">
<item>
<property name="text">
<string>请选择</string>
</property>
</item>
<item>
<property name="text">
<string>S通道</string>
</property>
</item>
<item>
<property name="text">
<string>U通道</string>
</property>
</item>
<item>
<property name="text">
<string>自动</string>
</property>
</item>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>默认话音通道:</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>U默认电话号码</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>S默认电话号码</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -1,7 +1,4 @@
#include "RecordQuery.h"
#include <QCoreApplication>
#include <QMessageBox>
#include <filesystem>
@@ -136,8 +133,28 @@ void RecordQuery::UpdateRecordList(const std::vector<DbRecord>& records){
item->setTextAlignment(Qt::AlignCenter);
ui->tblRecordList->setItem(rowIndex, column_index, item);
column_index = column_index + 1;
// 通话时长
item = new QTableWidgetItem(QString::asprintf("%d s",r.callDuration));
// 通话时长,根据时长按x时x分x秒显示
QString callDurationStr = "";
if(r.type == int(CommType::Call))
{
QTime time(0, 0, 0);
time = time.addSecs(r.callDuration);
if (r.callDuration >= 3600) {
callDurationStr = QString("%1 时 %2 分 %3 秒")
.arg(time.hour())
.arg(time.minute())
.arg(time.second());
} else if (r.callDuration >= 60) {
callDurationStr = QString("%1 分 %2 秒")
.arg(time.minute())
.arg(time.second());
} else {
callDurationStr = QString("%1 秒").arg(time.second());
}
}
item = new QTableWidgetItem(callDurationStr);
item->setTextAlignment(Qt::AlignCenter);
ui->tblRecordList->setItem(rowIndex, column_index, item);
column_index = column_index + 1;

View File

@@ -35,6 +35,8 @@ MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
setWindowTitle("卫星终端控制软件_V1.0.3");
//创建logger窗口
m_loggerWidget = std::make_shared<LoggerWidget>();//需要在RecordQuery创建前
m_loggerWidget->hide();
@@ -43,10 +45,17 @@ MainWindow::MainWindow(QWidget *parent)
//创建记录查询窗口
m_recordQueryWidget = std::make_shared<RecordQuery>();
m_recordQueryWidget->hide();
//创建参数配置窗口
m_configParamWidget = std::make_shared<ConfigParam>();
m_configParamWidget->hide();
connect(&*m_configParamWidget, &ConfigParam::sendUdpRequest,
this, &MainWindow::handleUdpRequest);
//创建并初始化图表
createBeiDouSignalStrengthChart();
createAzimuthMapChart();
createBeiDouRDSSSignalStrengthChart();
//
QSplitter *splitter = new QSplitter(Qt::Horizontal);
splitter->addWidget(ui->widgetCallAndMessage);
@@ -54,6 +63,7 @@ MainWindow::MainWindow(QWidget *parent)
setCentralWidget(splitter);
ui->lblPosition->clear();
ui->lblZhuanTaiStatus->clear();
ui->lblHydraulicCylinderHeight->clear();
ui->lblAntennaPowerSupply->clear();
ui->lblPhaseLockedLoop->clear();
@@ -65,6 +75,20 @@ MainWindow::MainWindow(QWidget *parent)
ui->lblCallDuration->hide();
ui->btnCallReject->hide();
// 禁用控件
ui->btnUHFSimCardStatus->setEnabled(false);
ui->labelUHFSimCardStatus->setEnabled(false);
// 设置透明样式
QString transparentStyle =
"QToolButton:disabled, QLabel:disabled {"
" background: transparent;"
" border: none;"
" color: transparent;"
"}";
ui->btnUHFSimCardStatus->setStyleSheet(transparentStyle);
ui->labelUHFSimCardStatus->setStyleSheet(transparentStyle);
QString exeDir = QCoreApplication::applicationDirPath();
QSettings settings(exeDir + "/app.ini", QSettings::IniFormat);
@@ -131,14 +155,14 @@ void MainWindow::onTimerTimeout1s(){
m_beidouModuleStatusGrayIcon = !m_beidouModuleStatusGrayIcon;
}
//sim卡状态
if(m_uhfSimCardStatus == SimCardStatus::kChecking){
if(m_uhfSimCardStatusGrayIcon){
ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
}else{
ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
}
m_uhfSimCardStatusGrayIcon = !m_uhfSimCardStatusGrayIcon;
}
//if(m_uhfSimCardStatus == SimCardStatus::kChecking){
// if(m_uhfSimCardStatusGrayIcon){
// ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
// }else{
// ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
// }
// m_uhfSimCardStatusGrayIcon = !m_uhfSimCardStatusGrayIcon;
//}
if(m_tiantongSimCardStatus == SimCardStatus::kChecking){
if(m_tiantongSimCardStatusGrayIcon){
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
@@ -175,17 +199,17 @@ void MainWindow::onTimerTimeout1s(){
// 入网状态
if(m_uhfNetworkAccessStatus == NetworkAccessStatus::kConnecting){
if(m_uhfNetworkAccessStatusGrayIcon){
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_in_no_data.png"));
}else{
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_out.png"));
}
m_uhfNetworkAccessStatusGrayIcon = !m_uhfNetworkAccessStatusGrayIcon;
}
if(m_tiantongNetworkAccessStatus == NetworkAccessStatus::kConnecting){
if(m_tiantongNetworkAccessStatusGrayIcon){
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_in_no_data.png"));
}else{
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_out.png"));
}
m_tiantongNetworkAccessStatusGrayIcon = !m_tiantongNetworkAccessStatusGrayIcon;
}
@@ -212,6 +236,7 @@ void MainWindow::handleUdpRequest(const QByteArray &message)
//m_loggerWidget->updateRespStatus(message);
}
//ctrl+l用于打开日志窗口
void MainWindow::keyPressEvent(QKeyEvent* event){
if(event->key() == Qt::Key_L && event->modifiers() & Qt::ControlModifier){
m_loggerWidget->show();
@@ -221,11 +246,16 @@ void MainWindow::keyPressEvent(QKeyEvent* event){
}
void MainWindow::StartupTalking(){
if(m_talkingTimer->isActive()){
if(m_talkingTimer->isActive()){
ui->lblCallDuration->show();
return;
}
m_currentTalkingBeginTime = QDateTime::currentDateTime();
m_callDuration = 0;
QTime t(0,0,0);
t = t.addSecs(m_callDuration);
ui->lblCallDuration->setText(t.toString("hh:mm:ss"));
ui->lblCallDuration->show();
m_talkingTimer->start(1000);
}
void MainWindow::ShutdownTalking(){
@@ -268,13 +298,13 @@ void MainWindow::readPendingDatagrams(){
void MainWindow::test() {
// 随机生成信号能量数据
setSignalStrengthValues(
QStringList{"1号星", "2号星", "3号星", "4号星", "5号星", "6号星"},
QStringList{"01", "02", "03", "04", "05", "06", "07", "08", "09"},
QList{get_rand(10.0), get_rand(10.0), get_rand(10.0), get_rand(10.0),
get_rand(10.0), get_rand(10.0)});
get_rand(10.0), get_rand(10.0), get_rand(50.0), get_rand(33.0), get_rand(27.0)});
// 随机生成方向图数据
QList<QPointF> values;
for (int i = 0; i < 6; i += 1) {
for (int i = 0; i < 9; i += 1) {
values.append(QPointF(get_rand(360.0), get_rand(360.0)));
}
setAzimuthValues(values);
@@ -321,7 +351,7 @@ void MainWindow::test() {
void MainWindow::test1(){
// 随机生成信号能量数据
setSignalStrengthValues(
QStringList{"1号星", "2号星", "3号星", "4号星", "5号星", "6号星"},
QStringList{"01", "02", "03", "04", "05", "06"},
QList{get_rand(20.0), get_rand(45.0), get_rand(50.0), get_rand(45.0),
get_rand(50.0), get_rand(40.0)});
@@ -381,9 +411,8 @@ void MainWindow::handleHovered(bool status, int index, QBarSet* barset)
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
void MainWindow::createBeiDouSignalStrengthChart() {
m_signalStrengthChart = new QChart;
m_signalStrengthChart->setTitle("信号强度");
m_signalStrengthChart->setTitle("载噪比");
m_signalStrengthChart->legend()->setVisible(false);
m_signalStrengthChart->legend()->setAlignment(Qt::AlignBottom);
// m_signalStrengthChart->setAnimationOptions(QChart::SeriesAnimations);
@@ -489,6 +518,125 @@ void MainWindow::setSignalStrengthValues(const QStringList &categories,
// 更新卫星数量显示
ui->lblSatelliteCount->setText(QString::asprintf("%d", categories.count()));
}
void MainWindow::createBeiDouRDSSSignalStrengthChart() {
m_RDS1signalStrengthChart = new QChart;
m_RDS1signalStrengthChart->setTitle("载噪比");
m_RDS1signalStrengthChart->legend()->setVisible(false);
m_RDS1signalStrengthChart->legend()->setAlignment(Qt::AlignBottom);
// m_RDS1signalStrengthChart->setAnimationOptions(QChart::SeriesAnimations);
m_RDS1signalStrengthChartXAxis = new QBarCategoryAxis;
m_RDS1signalStrengthChart->addAxis(m_RDS1signalStrengthChartXAxis, Qt::AlignBottom);
m_RDS1signalStrengthChartYAxis = new QValueAxis;
m_RDS1signalStrengthChartYAxis->setRange(0, 50);
m_RDS1signalStrengthChart->addAxis(m_RDS1signalStrengthChartYAxis, Qt::AlignLeft);
// series->attachAxis(axisY);
QChartView *chartView = new QChartView(m_RDS1signalStrengthChart, this);
chartView->setRenderHint(QPainter::Antialiasing);
ui->vboxChannelBeidouRDS1SignalStrength->addWidget(chartView);
m_RDS2signalStrengthChart = new QChart;
m_RDS2signalStrengthChart->setTitle("载噪比");
m_RDS2signalStrengthChart->legend()->setVisible(false);
m_RDS2signalStrengthChart->legend()->setAlignment(Qt::AlignBottom);
// m_RDS2signalStrengthChart->setAnimationOptions(QChart::SeriesAnimations);
m_RDS2signalStrengthChartXAxis = new QBarCategoryAxis;
m_RDS2signalStrengthChart->addAxis(m_RDS2signalStrengthChartXAxis, Qt::AlignBottom);
m_RDS2signalStrengthChartYAxis = new QValueAxis;
m_RDS2signalStrengthChartYAxis->setRange(0, 50);
m_RDS2signalStrengthChart->addAxis(m_RDS2signalStrengthChartYAxis, Qt::AlignLeft);
// series->attachAxis(axisY);
QChartView *chartView2 = new QChartView(m_RDS2signalStrengthChart, this);
chartView->setRenderHint(QPainter::Antialiasing);
ui->vboxChannelBeidouRDS2SignalStrength->addWidget(chartView2);
}
void MainWindow::setRDSSSignalStrengthValues(uint8_t type, const QStringList &categories,
const QList<qreal> &yValues) {
if((type != uint8_t(RDSSType::RDSS_S1)) && (type != uint8_t(RDSSType::RDSS_S2))){
m_logger->error("RDSSType: type illegal value, type = {}", type);
return;
}
if(type == uint8_t(RDSSType::RDSS_S1))
{
// 清空旧数据
m_RDS1signalStrengthChart->removeAllSeries();
m_RDS1signalStrengthChartXAxis->clear();
}
else
{
// 清空旧数据
m_RDS2signalStrengthChart->removeAllSeries();
m_RDS2signalStrengthChartXAxis->clear();
}
// 创建数据集
QBarSet *set0 = new QBarSet("Power");
QBarSet *set1 = new QBarSet("Power2");
foreach (qreal val, yValues) {
if(val >= 36.0)
{
*set0 << 0;
*set1 << val;
}
else
{
*set0 << val;
*set1 << 0;
}
}
// 动态设置柱形颜色
set0->setBrush(QBrush(QColor("#C0C0C0")));
set1->setBrush(QBrush(QColor("#0000FF")));
QStackedBarSeries *series2 = new QStackedBarSeries();
series2->append(set0);
series2->append(set1);
// 添加对象追踪防止内存泄漏
set0->setParent(series2); // 建立父子关系
set1->setParent(series2); // 建立父子关系
if(type == uint8_t(RDSSType::RDSS_S1))
{
m_RDS1signalStrengthChart->addSeries(series2);
series2->attachAxis(m_RDS1signalStrengthChartYAxis);
// 设置X轴标签
m_RDS1signalStrengthChartXAxis->append(categories);
// 优化显示效果
series2->setLabelsVisible(false); // 隐藏数值标签
m_RDS1signalStrengthChart->legend()->hide(); // 隐藏图例
// 更新卫星数量显示
ui->rds1SatelliteCount->setText(QString::asprintf("%d", categories.count()));
}
else
{
m_RDS2signalStrengthChart->addSeries(series2);
series2->attachAxis(m_RDS2signalStrengthChartYAxis);
// 设置X轴标签
m_RDS2signalStrengthChartXAxis->append(categories);
// 优化显示效果
series2->setLabelsVisible(false); // 隐藏数值标签
m_RDS2signalStrengthChart->legend()->hide(); // 隐藏图例
// 更新卫星数量显示
ui->rds2SatelliteCount->setText(QString::asprintf("%d", categories.count()));
}
}
void MainWindow::createAzimuthMapChart() {
const qreal angularMin = 0;
const qreal angularMax = 360;
@@ -616,6 +764,12 @@ bool MainWindow::checkNumber(const QString& number){
QMessageBox::information(this, "错误", "请输入电话号码");
return false;
}
// 检查号码是否只包含数字 0-9
QRegularExpression digitOnly("^[0-9]*$"); // 正则表达式:只允许数字
if (!digitOnly.match(number).hasMatch()) {
QMessageBox::information(this, "错误", "电话号码只能包含数字0-9");
return false;
}
//检查号码长度
if (number.size() > 20){
QMessageBox::information(this, "错误", "电话号码长度不能超过20");
@@ -637,27 +791,59 @@ bool MainWindow::checkMessage(const QString& message){
}
return true;
}
std::pair<bool,Channel> MainWindow::selectChannel(CommType comm_type){
bool isUhfChannelOk = (m_uhfModuleStatus == ModuleStatus::kChecking || m_uhfModuleStatus == ModuleStatus::kNormal)
&& (m_uhfSimCardStatus == SimCardStatus::kExist || m_uhfSimCardStatus == SimCardStatus::kChecking)
std::pair<bool,Channel> MainWindow::selectChannel(ChannelType comm_type){
bool isUhfChannelOk = (m_uhfModuleStatus == ModuleStatus::kNormal)
&& (m_uhfSimCardStatus == SimCardStatus::kExist)
&& (m_uhfNetworkAccessStatus == NetworkAccessStatus::kConnectedDataIsActivated || m_uhfNetworkAccessStatus == NetworkAccessStatus::kConnectedDataIsNotActivated);
bool isSChannelOk = (m_tiantongModuleStatus == ModuleStatus::kChecking || m_tiantongModuleStatus == ModuleStatus::kNormal)
&& (m_tiantongSimCardStatus == SimCardStatus::kExist || m_tiantongSimCardStatus == SimCardStatus::kChecking)
bool isSChannelOk = (m_tiantongModuleStatus == ModuleStatus::kNormal)
&& (m_tiantongSimCardStatus == SimCardStatus::kExist)
&& (m_tiantongNetworkAccessStatus == NetworkAccessStatus::kConnectedDataIsActivated || m_tiantongNetworkAccessStatus == NetworkAccessStatus::kConnectedDataIsNotActivated);
if(!isUhfChannelOk && !isSChannelOk){
QMessageBox::information(this, "提示", "UHF和S通道都不正常, 无法进行通信");
return std::make_pair(false,Channel::Uhf);
}
if(isUhfChannelOk && !isSChannelOk){
return std::make_pair(true,Channel::Uhf);
}else if(!isUhfChannelOk && isSChannelOk){
return std::make_pair(true,Channel::S);;
}else{
if(m_uhfSignalStrength >= m_tiantongSignalStrength){
return std::make_pair(true,Channel::Uhf);
}else{
return std::make_pair(true,Channel::S);
if(comm_type == ChannelType::ChannelUHF)
{
if(!isUhfChannelOk)
{
QMessageBox::information(this, "提示", "UHF通道不正常, 无法进行通信");
return std::make_pair(false,Channel::Uhf);
}
else
{
return std::make_pair(true,Channel::Uhf);
}
}
else if(comm_type == ChannelType::ChannelS)
{
if(!isSChannelOk)
{
QMessageBox::information(this, "提示", "S通道不正常, 无法进行通信");
return std::make_pair(false,Channel::S);
}
else
{
return std::make_pair(true,Channel::S);
}
}
else if(comm_type == ChannelType::ChannelAuto)
{
if(!isUhfChannelOk && !isSChannelOk){
QMessageBox::information(this, "提示", "UHF和S通道都不正常, 无法进行通信");
return std::make_pair(false,Channel::S);
}
if(isUhfChannelOk && !isSChannelOk){
return std::make_pair(true,Channel::Uhf);
}else if(!isUhfChannelOk && isSChannelOk){
return std::make_pair(true,Channel::S);
}else{
if(m_tiantongSignalStrength >= m_uhfSignalStrength){
return std::make_pair(true,Channel::S);
}else{
return std::make_pair(true,Channel::Uhf);
}
}
}
else
{
QMessageBox::information(this, "提示", "通道错误, 无法进行通信");
return std::make_pair(false,Channel::Uhf);
}
}
void MainWindow::on_btnCallAnswer_clicked() {
@@ -667,25 +853,28 @@ void MainWindow::on_btnCallAnswer_clicked() {
if(!checkNumber(number)){
return;
}
ChannelType commtype;
// 呼叫
if(ui->rdbChannelUHF->isChecked()){
sendUdpMessage(pack_uhf_dial_cmd(number.toStdString()));
m_currentTalkingDirection = CommDirection::Send;
commtype = ChannelType::ChannelUHF;
}else if(ui->rdbChannelS->isChecked()){
sendUdpMessage(pack_tiantong_dial_cmd(number.toStdString()));
commtype = ChannelType::ChannelS;
}else if(ui->rdbChannelAuto->isChecked()){
std::pair<bool,Channel> r = selectChannel(CommType::Call);
if(!r.first){
return;
}
if(r.second == Channel::Uhf){
sendUdpMessage(pack_uhf_dial_cmd(number.toStdString()));
}else if(r.second == Channel::S){
sendUdpMessage(pack_tiantong_dial_cmd(number.toStdString()));
}
commtype = ChannelType::ChannelAuto;
}else{
return;
}
}
if(m_uhfCallStatus == CallStatus::kCallIsComing){
std::pair<bool,Channel> r = selectChannel(commtype);
if(!r.first){
return;
}
m_currentTalkingDirection = CommDirection::Send;
if(r.second == Channel::Uhf){
sendUdpMessage(pack_uhf_dial_cmd(number.toStdString()));
}else if(r.second == Channel::S){
sendUdpMessage(pack_tiantong_dial_cmd(number.toStdString()));
}
}else if(m_uhfCallStatus == CallStatus::kCallIsComing){
sendUdpMessage(pack_uhf_answer());
}else if(m_tiantongCallStatus == CallStatus::kCallIsComing){
sendUdpMessage(pack_tiantong_answer());
@@ -703,6 +892,7 @@ void MainWindow::on_btnCallReject_clicked() {
void MainWindow::on_btnSendMessageByUhfOrS_clicked() {
QString number = ui->cmbMessageNumberForUhfAndS->currentText();
ChannelType commtype;
if(!checkNumber(number)){
return;
}
@@ -712,19 +902,22 @@ void MainWindow::on_btnSendMessageByUhfOrS_clicked() {
}
// 发送信息
if(ui->rdbChannelUHF->isChecked()){
commtype = ChannelType::ChannelUHF;
}else if(ui->rdbChannelS->isChecked()){
commtype = ChannelType::ChannelS;
}else if(ui->rdbChannelAuto->isChecked()){
commtype = ChannelType::ChannelAuto;
}else{
return;
}
std::pair<bool,Channel> r = selectChannel(commtype);
if(!r.first){
return;
}
if(r.second == Channel::Uhf){
sendUdpMessage(pack_uhf_short_message_cmd(number.toStdString(),message.toStdU16String()));
}else if(ui->rdbChannelS->isChecked()){
}else if(r.second == Channel::S){
sendUdpMessage(pack_tiantong_short_message_cmd(number.toStdString(),message.toStdU16String()));
}else if(ui->rdbChannelAuto->isChecked()){
std::pair<bool,Channel> r = selectChannel(CommType::Call);
if(!r.first){
return;
}
if(r.second == Channel::Uhf){
sendUdpMessage(pack_uhf_short_message_cmd(number.toStdString(),message.toStdU16String()));
}else if(r.second == Channel::S){
sendUdpMessage(pack_tiantong_short_message_cmd(number.toStdString(),message.toStdU16String()));
}
}
}
@@ -812,6 +1005,13 @@ void MainWindow::processCommand(QByteArray& cmd){
case uint8_t(CommandType::kSearchSatelliteStatusReport):
processSearchSatelliteStatusReport(cmd);
break;
case uint8_t(CommandType::kSearchZhuanTaiStatusReport):
processZhuanTaiStatusReportCmd(cmd);
break;
case uint8_t(CommandType::kConfigCmdDefaultChannelAndNumber):
case uint8_t(CommandType::kConfigCmdUDataChannelKeepTime):
m_configParamWidget->processConfigCmd(cmd);
break;
case uint8_t(CommandType::kDebugCmd):
processDebugCmd(cmd);
break;
@@ -1006,7 +1206,11 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
uint8_t uhf_m_card_status = cmd[data_index++];//m卡状态
uint8_t uhf_call_status = cmd[data_index++];//通话状态
uint8_t uhf_satellite_signal_strength = cmd[data_index++];
std::string uhf_number = std::string(cmd.data()+data_index,20);
// 使用 QByteArray 处理
QByteArray uhf_data = QByteArray::fromRawData(cmd.constData() + data_index, 20);
uhf_data.replace('\0', ""); // 移除所有空字符
// 转换为 std::string
std::string uhf_number = uhf_data.toStdString();
data_index += 20;
//天通状态
uint8_t tiantong_module_status = cmd[data_index++];//模块状态
@@ -1015,7 +1219,11 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
uint8_t tiantong_m_card_status = cmd[data_index++];//m卡状态
uint8_t tiantong_call_status = cmd[data_index++];//通话状态
uint8_t tiantong_satellite_signal_strength = cmd[data_index++];
std::string tiantong_number = std::string(cmd.constData()+data_index,20);
// 使用 QByteArray 处理
QByteArray tiantong_data = QByteArray::fromRawData(cmd.constData() + data_index, 20);
tiantong_data.replace('\0', ""); // 移除所有空字符
// 转换为 std::string
std::string tiantong_number = tiantong_data.toStdString();
data_index += 20;
//北斗状态
@@ -1071,7 +1279,7 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
processUhfNetworkAccessStatus(uhf_network_access_status);
processTianTongNetworkAccessStatus(tiantong_network_access_status);
// 处理sim卡状态
processUhfSimCardStatus(uhf_sim_card_status);
//processUhfSimCardStatus(uhf_sim_card_status);
processTianTongSimCardStatus(tiantong_sim_card_status);
processBeiDouSimCardStatus(beidou_sim_card_status);
// 处理m卡状态
@@ -1079,17 +1287,54 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
processTianTongMCardStatus(tiantong_m_card_status);
//处理呼叫状态
processCallStatus(tiantong_call_status,uhf_call_status,tiantong_number,uhf_number);
// 处理信号强度,信号强度范围是否是0~100之间???
m_uhfSignalStrength = uhf_satellite_signal_strength;
m_tiantongSignalStrength = tiantong_satellite_signal_strength;
ui->progressChannelUHFSignalStrength->setValue(m_uhfSignalStrength);
ui->progressChannelSSignalStrength->setValue(m_tiantongSignalStrength);
// 处理信号强度,信号强度范围转换
//m_uhfSignalStrength = uhf_satellite_signal_strength;
// 计算大致区间
if (uhf_satellite_signal_strength == 0) {
m_uhfSignalStrength = 0;
ui->btnUHFSignalStrength->setIcon(QIcon(":/rc/res/signal_0.png"));
} else if (uhf_satellite_signal_strength <= 63) {
m_uhfSignalStrength = 25;
ui->btnUHFSignalStrength->setIcon(QIcon(":/rc/res/signal_1.png"));
} else if (uhf_satellite_signal_strength <= 127) {
m_uhfSignalStrength = 50;
ui->btnUHFSignalStrength->setIcon(QIcon(":/rc/res/signal_2.png"));
} else if (uhf_satellite_signal_strength <= 191) {
m_uhfSignalStrength = 75;
ui->btnUHFSignalStrength->setIcon(QIcon(":/rc/res/signal_3.png"));
} else {
m_uhfSignalStrength = 100;
ui->btnUHFSignalStrength->setIcon(QIcon(":/rc/res/signal_4.png"));
}
ui->btnUHFSignalStrength->setToolTip(QString("%1").arg(uhf_satellite_signal_strength));
//m_tiantongSignalStrength = tiantong_satellite_signal_strength;
if (tiantong_satellite_signal_strength == 0) {
m_tiantongSignalStrength = 0;
ui->btnSSignalStrength->setIcon(QIcon(":/rc/res/signal_0.png"));
} else if (tiantong_satellite_signal_strength >= 1 && tiantong_satellite_signal_strength <= 3) {
m_tiantongSignalStrength = 25;
ui->btnSSignalStrength->setIcon(QIcon(":/rc/res/signal_1.png"));
} else if (tiantong_satellite_signal_strength > 3 && tiantong_satellite_signal_strength <= 6) {
m_tiantongSignalStrength = 50;
ui->btnSSignalStrength->setIcon(QIcon(":/rc/res/signal_2.png"));
} else if (tiantong_satellite_signal_strength > 6 && tiantong_satellite_signal_strength <= 9) {
m_tiantongSignalStrength = 75;
ui->btnSSignalStrength->setIcon(QIcon(":/rc/res/signal_3.png"));
} else if (tiantong_satellite_signal_strength > 10) {
m_tiantongSignalStrength = 100;
ui->btnSSignalStrength->setIcon(QIcon(":/rc/res/signal_4.png"));
}
ui->btnSSignalStrength->setToolTip(QString("%1").arg(tiantong_satellite_signal_strength));
// 处理来电号码,在processCallStatus中处理
//if(!uhf_number.empty()){
// ui->cmbCallNumber->setCurrentText(QString::fromStdString(uhf_number));
//}else{
// ui->cmbCallNumber->setCurrentText(QString::fromStdString(tiantong_number));
//}
// 处理位置
if(beidou_pos_status == 0x01)
{
@@ -1122,46 +1367,141 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
ui->lblPhaseLockedLoop->setText(s);
}
void MainWindow::processSearchSatelliteStatusReport(const QByteArray& cmd){
if(cmd.size() < FRAME_MIN_LEN + 1){
//m_logger->error("接收的搜星状态包长度错误, 长度 = {}",cmd.size());
m_logger->error("The received search satellite status packet length is incorrect, len = {}",cmd.size());
return;
int data_index, i;
uint8_t number_of_satellite, number_of_rds1satellite, number_of_rds2satellite;
std::vector<SatelliteStatus> all_satellite_status;
std::vector<RDSSSatelliteStatus> rdss_s1satellite_status, rdss_s2satellite_status;
QList<QString> categories, s1categories, s2categories;
QList<qreal> yValues, s1yValues, s2yValues;
QList<QPointF> azimuth_pitch_values;
switch(uint8_t(cmd[SUB_COMMAND_TYPE_INDEX]))
{
case uint8_t(SearchSatelliteStatusReportSubCommandType::kRnss):
if(cmd.size() < FRAME_MIN_LEN + 1){
//m_logger->error("接收的搜星状态包长度错误, 长度 = {}",cmd.size());
m_logger->error("The received search satellite status packet length is incorrect, len = {}",cmd.size());
return;
}
data_index = COMMAND_DATA_BEGIN_INDEX;
number_of_satellite = cmd[data_index++];//卫星数量
if(cmd.size() < (FRAME_MIN_LEN + 1 + 6* number_of_satellite)){
//m_logger->error("接收的rnss搜星状态包长度错误, 卫星个数 = {}, 长度 = {}",number_of_satellite,cmd.size());
m_logger->error("The received search rnss satellite status packet length is incorrect, satellite_num = {}, len = {}",number_of_satellite,cmd.size());
}
for(i = 0 ; i < number_of_satellite; i++){
SatelliteStatus status;
status.number = cmd[data_index++];//卫星编号
status.locate_flag = cmd[data_index++];//卫星定位标志
status.snr = cmd[data_index++];//卫星信噪比
status.azimuth = qFromLittleEndian<quint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));//卫星方位角
data_index += 2;
status.pitch = cmd[data_index++];//卫星俯仰角
all_satellite_status.push_back(status);
}
// 处理卫星状态
for(i = 0 ; i < all_satellite_status.size(); i++){
//categories.push_back(QString("%1").arg(i));
//categories.push_back(QString("%1").arg(all_satellite_status[i].number));
//categories.push_back(QString("%1").arg(all_satellite_status[i].number, 2, 10, QChar('0')));//与下面等效
categories.push_back(QString::asprintf("%02d", all_satellite_status[i].number));
yValues.push_back(all_satellite_status[i].snr);
azimuth_pitch_values.push_back(QPointF(all_satellite_status[i].azimuth,all_satellite_status[i].pitch));
}
// 设置信号能量
setSignalStrengthValues(categories,yValues);
// 设置方位俯仰角
setAzimuthValues(azimuth_pitch_values);
break;
case uint8_t(SearchSatelliteStatusReportSubCommandType::kRdss):
if(cmd.size() < FRAME_MIN_LEN + 2){
//m_logger->error("接收的rdss搜星状态包长度错误, 长度 = {}",cmd.size());
m_logger->error("The received search rdss satellite status packet length is incorrect, len = {}",cmd.size());
return;
}
data_index = COMMAND_DATA_BEGIN_INDEX;
number_of_rds1satellite = cmd[data_index++];//RDSS S1波束数量
number_of_rds2satellite = cmd[data_index+3*number_of_rds1satellite];//RDSS S2波束数量
if(cmd.size() < (FRAME_MIN_LEN + 2 + 3 * (number_of_rds1satellite + number_of_rds2satellite))){
//m_logger->error("接收的rdss搜星状态包长度错误, RDSS S1波束个数 = {}, RDSS S2波束个数 = {}, 长度 = {}",number_of_rds1satellite,number_of_rds1satellite,cmd.size());
m_logger->error("The received search rdss satellite status packet length is incorrect, rds1satellite_num = {}, rds2satellite_num = {}, len = {}",number_of_rds1satellite,number_of_rds2satellite,cmd.size());
}
for(i = 0 ; i < number_of_rds1satellite; i++){
RDSSSatelliteStatus s1status;
s1status.number = cmd[data_index++]; //波束编号
s1status.snr1 = cmd[data_index++]; //波束载噪比1
s1status.snr2 = cmd[data_index++]; //波束载噪比2
rdss_s1satellite_status.push_back(s1status);
}
// 处理卫星状态
for(i = 0 ; i < rdss_s1satellite_status.size(); i++){
//s1categories.push_back(QString("%1").arg(rdss_s1satellite_status[i].number, 2, 10, QChar('0')));//与下面等效
s1categories.push_back(QString::asprintf("%02d", rdss_s1satellite_status[i].number));
s1yValues.push_back(rdss_s1satellite_status[i].snr1); //两个载噪比基本一致
}
// 设置信号能量
setRDSSSignalStrengthValues(uint8_t(RDSSType::RDSS_S1), s1categories, s1yValues);
data_index++; //S2波束锁定数量
for(i = 0 ; i < number_of_rds2satellite; i++){
RDSSSatelliteStatus s2status;
s2status.number = cmd[data_index++]; //波束编号
s2status.snr1 = cmd[data_index++]; //波束载噪比1
s2status.snr2 = cmd[data_index++]; //波束载噪比2
rdss_s2satellite_status.push_back(s2status);
}
// 处理卫星状态
for(i = 0 ; i < rdss_s2satellite_status.size(); i++){
//s2categories.push_back(QString("%1").arg(rdss_s2satellite_status[i].number, 2, 10, QChar('0')));//与下面等效
s2categories.push_back(QString::asprintf("%02d", rdss_s2satellite_status[i].number));
s2yValues.push_back(rdss_s2satellite_status[i].snr1); //两个载噪比基本一致
}
setRDSSSignalStrengthValues(uint8_t(RDSSType::RDSS_S2), s2categories, s2yValues);
break;
default:
m_logger->error("SearchSatelliteStatusReportSubCommandType is incorrect, type = 0x{:02X}", cmd[SUB_COMMAND_TYPE_INDEX] & 0xFF);
break;
}
if(uint8_t(cmd[SUB_COMMAND_TYPE_INDEX]) != 0){
}
void MainWindow::processZhuanTaiStatusReportCmd(const QByteArray& cmd){
if(cmd.size() != FRAME_LEN_ZHUANTAISTATUSREPORT){
//m_logger->error("接收的转台状态包长度错误, 长度 = {}",cmd.size());
m_logger->error("The received zhuantai status packet length is incorrect, len = {}",cmd.size());
return;
}
int data_index = COMMAND_DATA_BEGIN_INDEX;
uint8_t number_of_satellite = cmd[data_index++];//卫星数量
//通信状态
uint8_t commu_state = cmd[data_index++];
//定位状态
uint8_t locate_state = cmd[data_index++];
uint16_t az_angle = ((uint16_t)cmd[data_index] << 8) | cmd[data_index+1];
data_index += 2;
if(cmd.size() < FRAME_MIN_LEN + 1 + 6* number_of_satellite){
//m_logger->error("接收的搜星状态包长度错误, 卫星个数 = {}, 长度 = {}",number_of_satellite,cmd.size());
m_logger->error("The received search satellite status packet length is incorrect, satellite_num = {}, len = {}",number_of_satellite,cmd.size());
}
uint16_t el_angle = ((uint16_t)cmd[data_index] << 8) | cmd[data_index+1];
data_index += 2;
std::vector<SatelliteStatus> all_satellite_status;
for(int i = 0 ; i < number_of_satellite; ++i){
SatelliteStatus status;
status.number = cmd[data_index++];//卫星编号
status.locate_flag = cmd[data_index++];//卫星定位标志
status.snr = cmd[data_index++];//卫星信噪比
status.azimuth = qFromLittleEndian<quint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));//卫星方位角
data_index += 2;
status.pitch = cmd[data_index++];//卫星俯仰角
all_satellite_status.push_back(status);
QString s;
if(commu_state == uint8_t(PhaseLockedLoopStatus::kLocked) || commu_state == uint8_t(PhaseLockedLoopStatus::kUnlocked)){
s = QString("通信状态: %1, ").arg(commu_state == uint8_t(PhaseLockedLoopStatus::kLocked)?"正常":"异常");
}else{
s = QString("通信状态: 未知 ");
}
// 处理卫星状态
QList<QString> categories;
QList<qreal> yValues;
QList<QPointF> azimuth_pitch_values;
for(size_t i = 0 ; i < all_satellite_status.size(); ++i){
categories.push_back(QString("%1号星").arg(i));
yValues.push_back(all_satellite_status[i].snr);
azimuth_pitch_values.push_back(QPointF(all_satellite_status[i].azimuth,all_satellite_status[i].pitch));
if(commu_state == uint8_t(PhaseLockedLoopStatus::kLocked))
{
if(locate_state == uint8_t(PhaseLockedLoopStatus::kLocked) || locate_state == uint8_t(PhaseLockedLoopStatus::kUnlocked)){
s += QString("定位状态: %1, ").arg(locate_state == uint8_t(PhaseLockedLoopStatus::kLocked)?"锁定":"未锁定");
}else{
s += QString("定位状态: 未知, ");
}
s += QString("方位角: %1, ").arg((double)az_angle/100, 0, 'f', 2);
s += QString("俯仰角: %1 ").arg((double)el_angle/100, 0, 'f', 2);
}
// 设置信号能量
setSignalStrengthValues(categories,yValues);
// 设置方位俯仰角
setAzimuthValues(azimuth_pitch_values);
ui->lblZhuanTaiStatus->setText(s);
}
void MainWindow::processDebugCmd(const QByteArray& cmd){
@@ -1204,14 +1544,15 @@ void MainWindow::processUhfModuleStatus(uint8_t status){
ui->btnUHFModuleStatus->setToolTip("检测中");
break;
case ModuleStatus::kNormal:
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/module_ok.png"));
ui->btnUHFModuleStatus->setToolTip("正常");
break;
case ModuleStatus::kFault:
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/module_error.png"));
ui->btnUHFModuleStatus->setToolTip("故障");
break;
case ModuleStatus::kUpgrading:
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/module_update.png"));
ui->btnUHFModuleStatus->setToolTip("升级中");
break;
}
@@ -1229,14 +1570,15 @@ void MainWindow::processTianTongModuleStatus(uint8_t status){
ui->btnSModueStatus->setToolTip("检测中");
break;
case ModuleStatus::kNormal:
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/module_ok.png"));
ui->btnSModueStatus->setToolTip("正常");
break;
case ModuleStatus::kFault:
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/module_error.png"));
ui->btnSModueStatus->setToolTip("故障");
break;
case ModuleStatus::kUpgrading:
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/module_update.png"));
ui->btnSModueStatus->setToolTip("升级中");
break;
}
@@ -1255,14 +1597,15 @@ void MainWindow::processBeiDouModuleStatus(uint8_t status){
ui->btnBeiDouModuleStatus->setToolTip("检测中");
break;
case ModuleStatus::kNormal:
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/module_ok.png"));
ui->btnBeiDouModuleStatus->setToolTip("正常");
break;
case ModuleStatus::kFault:
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/module_error.png"));
ui->btnBeiDouModuleStatus->setToolTip("故障");
break;
case ModuleStatus::kUpgrading:
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/module_update.png"));
ui->btnBeiDouModuleStatus->setToolTip("升级中");
break;
}
@@ -1281,11 +1624,11 @@ void MainWindow::processUhfSimCardStatus(uint8_t status){
ui->btnUHFSimCardStatus->setToolTip("正在检测");
break;
case SimCardStatus::kExist:
ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/sim_card_exist.png"));
ui->btnUHFSimCardStatus->setToolTip("存在");
break;
case SimCardStatus::kNotExist:
ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/sim_card_not_exist.png"));
ui->btnUHFSimCardStatus->setToolTip("不存在");
break;
}
@@ -1303,11 +1646,11 @@ void MainWindow::processTianTongSimCardStatus(uint8_t status){
ui->btnSSimCardStatus->setToolTip("正在检测");
break;
case SimCardStatus::kExist:
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/sim_card_exist.png"));
ui->btnSSimCardStatus->setToolTip("存在");
break;
case SimCardStatus::kNotExist:
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/sim_card_not_exist.png"));
ui->btnSSimCardStatus->setToolTip("不存在");
break;
}
@@ -1325,11 +1668,11 @@ void MainWindow::processBeiDouSimCardStatus(uint8_t status){
ui->btnBeiDouSimCardStatus->setToolTip("正在检测");
break;
case SimCardStatus::kExist:
ui->btnBeiDouSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnBeiDouSimCardStatus->setIcon(QIcon(":/rc/res/sim_card_exist.png"));
ui->btnBeiDouSimCardStatus->setToolTip("存在");
break;
case SimCardStatus::kNotExist:
ui->btnBeiDouSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnBeiDouSimCardStatus->setIcon(QIcon(":/rc/res/sim_card_not_exist.png"));
ui->btnBeiDouSimCardStatus->setToolTip("不存在");
break;
}
@@ -1348,15 +1691,15 @@ void MainWindow::processUhfMCardStatus(uint8_t status){
ui->btnUHFMCardStatus->setToolTip("正在检测");
break;
case MCardStatus::kExistNotEncryted:
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/m_card_no_stick.png"));
ui->btnUHFMCardStatus->setToolTip("存在未注密");
break;
case MCardStatus::kExistEncryted:
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/m_card_stick.png"));
ui->btnUHFMCardStatus->setToolTip("存在已注密");
break;
case MCardStatus::kNotExist:
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/m_card_not_exist.png"));
ui->btnUHFMCardStatus->setToolTip("不存在");
break;
}
@@ -1374,15 +1717,15 @@ void MainWindow::processTianTongMCardStatus(uint8_t status){
ui->btnSMCardStatus->setToolTip("正在检测");
break;
case MCardStatus::kExistNotEncryted:
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/m_card_no_stick.png"));
ui->btnSMCardStatus->setToolTip("存在未注密");
break;
case MCardStatus::kExistEncryted:
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/m_card_stick.png"));
ui->btnSMCardStatus->setToolTip("存在已注密");
break;
case MCardStatus::kNotExist:
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/m_card_not_exist.png"));
ui->btnSMCardStatus->setToolTip("不存在");
break;
}
@@ -1399,18 +1742,18 @@ void MainWindow::processUhfNetworkAccessStatus(uint8_t status){
m_uhfNetworkAccessStatus = NetworkAccessStatus(status);
switch(m_uhfNetworkAccessStatus){
case NetworkAccessStatus::kNotConnected:
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_out.png"));
ui->btnUHFNetworkAccessStatus->setToolTip("未入网");
break;
case NetworkAccessStatus::kConnecting:
ui->btnUHFNetworkAccessStatus->setToolTip("正在入网");
break;
case NetworkAccessStatus::kConnectedDataIsNotActivated:
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_in_no_data.png"));
ui->btnUHFNetworkAccessStatus->setToolTip("已入网, 数据未激活");
break;
case NetworkAccessStatus::kConnectedDataIsActivated:
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_in_data.png"));
ui->btnUHFNetworkAccessStatus->setToolTip("已入网, 数据已激活");
break;
}
@@ -1426,19 +1769,19 @@ void MainWindow::processTianTongNetworkAccessStatus(uint8_t status){
m_tiantongNetworkAccessStatus = NetworkAccessStatus(status);
switch(m_tiantongNetworkAccessStatus){
case NetworkAccessStatus::kNotConnected:
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_out.png"));
ui->btnSNetworkAccessStatus->setToolTip("未入网");
break;
case NetworkAccessStatus::kConnecting:
// ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
// ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_out.png"));
ui->btnSNetworkAccessStatus->setToolTip("正在入网");
break;
case NetworkAccessStatus::kConnectedDataIsNotActivated:
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_in_no_data.png"));
ui->btnSNetworkAccessStatus->setToolTip("已入网, 数据未激活");
break;
case NetworkAccessStatus::kConnectedDataIsActivated:
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/net_in_data.png"));
ui->btnSNetworkAccessStatus->setToolTip("已入网, 数据已激活");
break;
}
@@ -1476,8 +1819,9 @@ void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call
ui->lblCallStatus->setText("空闲");
ui->lblCallStatus->setStyleSheet("color: black;");
m_callStatusLabelBlack = true;
ui->lblCallDuration->hide();
ShutdownTalking();
ui->lblCallDuration->hide();
ui->lblCallDuration->setText(""); //清空
break;
case CallStatus::kDialing://拨号中
//拨号中
@@ -1486,6 +1830,7 @@ void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call
ui->btnCallReject->show();
ui->lblCallStatus->setText("拨号中...");
ui->lblCallDuration->hide();
ui->lblCallDuration->setText(""); //清空
break;
case CallStatus::kPeerRingTheBell://对方振铃
//对方振铃中
@@ -1494,12 +1839,12 @@ void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call
ui->btnCallReject->show();
ui->lblCallStatus->setText("对方振铃...");
ui->lblCallDuration->hide();
ui->lblCallDuration->setText(""); //清空
break;
case CallStatus::kOnLine://通话中
//通话中
if(chan == Channel::S){
m_currentTalkingNumber = tiantong_number;
ui->cmbCallNumber->setCurrentText(QString::fromStdString(tiantong_number));
}else{
m_currentTalkingNumber = uhf_number;
@@ -1513,7 +1858,6 @@ void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call
ui->lblCallStatus->setText("通话中...");
ui->lblCallStatus->setStyleSheet("color: green;");
m_callStatusLabelBlack = false;
ui->lblCallDuration->show();
StartupTalking();
break;
case CallStatus::kCallIsComing://来电中
@@ -1532,9 +1876,16 @@ void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call
ui->btnCallReject->show();
ui->lblCallStatus->setText("来电中...");
ui->lblCallDuration->hide();
ui->lblCallDuration->setText(""); //清空
break;
}
}
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
void MainWindow::on_btnConfigParam_clicked()
{
m_configParamWidget->show();
}

View File

@@ -11,10 +11,9 @@
#include "RecordQuery.h"
#include "LoggerWidget.h"
#include "ConfigParam.h"
#include "msg.h"
#include "spdlog/spdlog.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
@@ -58,12 +57,16 @@ private slots:
void onTimerTimeout1s();
void handleUdpRequest(const QByteArray &message);
void on_btnConfigParam_clicked();
protected:
void keyPressEvent(QKeyEvent* event) override;
private:
void createBeiDouSignalStrengthChart();
void createAzimuthMapChart();
void setSignalStrengthValues(const QStringList& categories,const QList<qreal> &yValues);
void createBeiDouRDSSSignalStrengthChart();
void setRDSSSignalStrengthValues(uint8_t type, const QStringList &categories, const QList<qreal> &yValues);
void setAzimuthValues(const QList<QPointF> &points);
//-------------------------------------------------
// 消息列表操作
@@ -82,6 +85,7 @@ private:
void processBeiDouShortMessageCmd(const QByteArray& cmd);
void processStatusReportCmd(const QByteArray& cmd);
void processSearchSatelliteStatusReport(const QByteArray& cmd);
void processZhuanTaiStatusReportCmd(const QByteArray& cmd);
void processDebugCmd(const QByteArray& cmd);
// 处理模块状态
void processUhfModuleStatus(uint8_t status);
@@ -105,7 +109,7 @@ private:
std::pair<QString,QString> parseReceivedShortMessage(const QByteArray& cmd,Channel chan);
std::pair<bool,Channel> selectChannel(CommType comm_type);
std::pair<bool,Channel> selectChannel(ChannelType comm_type);
bool checkNumber(const QString& number);
bool checkMessage(const QString& message);
@@ -167,10 +171,17 @@ private:
std::shared_ptr<QUdpSocket> m_udpServerSocket;
std::shared_ptr<RecordQuery> m_recordQueryWidget;
std::shared_ptr<LoggerWidget> m_loggerWidget;
std::shared_ptr<ConfigParam> m_configParamWidget;
QChart* m_signalStrengthChart;
QPolarChart* m_azimuthChart;
QBarCategoryAxis* m_signalStrengthChartXAxis;
QValueAxis* m_signalStrengthChartYAxis;
QStackedBarSeries *m_stackedSeries;
QChart* m_RDS1signalStrengthChart;
QBarCategoryAxis* m_RDS1signalStrengthChartXAxis;
QValueAxis* m_RDS1signalStrengthChartYAxis;
QChart* m_RDS2signalStrengthChart;
QBarCategoryAxis* m_RDS2signalStrengthChartXAxis;
QValueAxis* m_RDS2signalStrengthChartYAxis;
};
#endif // MAINWINDOW_H

View File

@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>卫星终端</string>
<string>卫星终端控制软件</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QWidget" name="widgetCallAndMessage" native="true">
@@ -36,16 +36,16 @@
</widget>
</item>
<item>
<widget class="QRadioButton" name="rdbChannelUHF">
<widget class="QRadioButton" name="rdbChannelS">
<property name="text">
<string>UHF</string>
<string>S</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rdbChannelS">
<widget class="QRadioButton" name="rdbChannelUHF">
<property name="text">
<string>S</string>
<string>UHF</string>
</property>
</widget>
</item>
@@ -73,7 +73,7 @@
<string>对方号码:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -90,7 +90,7 @@
<string>状态:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -197,7 +197,7 @@
<item>
<spacer name="horizontalSpacer_18">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -265,7 +265,7 @@
<item>
<spacer name="horizontalSpacer_23">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -301,7 +301,7 @@
<item>
<spacer name="horizontalSpacer_19">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -330,13 +330,13 @@
<item>
<widget class="QTableWidget" name="tblMessageList">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
<enum>QAbstractItemView::SelectionMode::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
<enum>QAbstractItemView::SelectionBehavior::SelectRows</enum>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
@@ -385,7 +385,7 @@
<item>
<spacer name="horizontalSpacer_20">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -415,7 +415,7 @@
<item>
<spacer name="horizontalSpacer_21">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -425,6 +425,13 @@
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btnConfigParam">
<property name="text">
<string>参数配置</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnRecordQuery">
<property name="text">
@@ -447,10 +454,10 @@
<widget class="QWidget" name="widgetSatelliteStatus" native="true">
<property name="geometry">
<rect>
<x>1020</x>
<y>280</y>
<width>755</width>
<height>432</height>
<x>984</x>
<y>71</y>
<width>580</width>
<height>571</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
@@ -459,7 +466,7 @@
<property name="title">
<string>卫星状态</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_30" stretch="0,0,1,1">
<layout class="QVBoxLayout" name="verticalLayout_30" stretch="0,0,1">
<item>
<widget class="QGroupBox" name="groupBox_48">
<property name="title">
@@ -494,7 +501,10 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_116">
<widget class="QLabel" name="labelUHFSimCardStatus">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string> SIM卡状态</string>
</property>
@@ -506,11 +516,7 @@
<string>不存在</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/rc/res/card_gray.png</normaloff>:/rc/res/card_gray.png</iconset>
<string/>
</property>
<property name="iconSize">
<size>
@@ -518,12 +524,15 @@
<height>24</height>
</size>
</property>
<property name="checkable">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_127">
<property name="text">
<string> M卡状态</string>
<string> M卡状态</string>
</property>
</widget>
</item>
@@ -564,7 +573,7 @@
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/rc/res/circle_gray.png</normaloff>:/rc/res/circle_gray.png</iconset>
<normaloff>:/rc/res/net_out.png</normaloff>:/rc/res/net_out.png</iconset>
</property>
<property name="iconSize">
<size>
@@ -588,15 +597,38 @@
</widget>
</item>
<item>
<widget class="QProgressBar" name="progressChannelUHFSignalStrength">
<property name="value">
<number>0</number>
<widget class="QToolButton" name="btnUHFSignalStrength">
<property name="toolTip">
<string>0</string>
</property>
<property name="format">
<string/>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/rc/res/signal_0.png</normaloff>:/rc/res/signal_0.png</iconset>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
@@ -704,7 +736,7 @@
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/rc/res/circle_gray.png</normaloff>:/rc/res/circle_gray.png</iconset>
<normaloff>:/rc/res/net_out.png</normaloff>:/rc/res/net_out.png</iconset>
</property>
<property name="iconSize">
<size>
@@ -737,15 +769,38 @@
</widget>
</item>
<item>
<widget class="QProgressBar" name="progressChannelSSignalStrength">
<property name="value">
<number>0</number>
<widget class="QToolButton" name="btnSSignalStrength">
<property name="toolTip">
<string>0</string>
</property>
<property name="format">
<string/>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="res.qrc">
<normaloff>:/rc/res/signal_0.png</normaloff>:/rc/res/signal_0.png</iconset>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
@@ -754,7 +809,7 @@
<property name="title">
<string>北斗</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_31" stretch="0,1">
<layout class="QVBoxLayout" name="verticalLayout_31" stretch="0,0">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_67">
<item>
@@ -763,7 +818,7 @@
<string>模块状态:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -793,7 +848,7 @@
<string> SIM卡状态</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -818,12 +873,46 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_123">
<widget class="QLabel" name="label_128">
<property name="text">
<string> 收星数</string>
<string> RDSS_S1波束锁定数量</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="rds1SatelliteCount">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_129">
<property name="text">
<string> RDSS_S2波束锁定数量</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="rds2SatelliteCount">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_123">
<property name="text">
<string> RNSS收星数</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
@@ -837,7 +926,7 @@
<item>
<spacer name="horizontalSpacer_22">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@@ -850,19 +939,121 @@
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="vboxChannelBeidouSignalStrength"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_51">
<property name="title">
<string>方位图</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_68">
<item>
<layout class="QVBoxLayout" name="vboxAzimuthMap"/>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>RDSS卫星</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QGroupBox" name="groupBox_53">
<property name="title">
<string>S1波束</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_71">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<layout class="QVBoxLayout" name="vboxChannelBeidouRDS1SignalStrength"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_54">
<property name="title">
<string>S2波束</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_72">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<layout class="QVBoxLayout" name="vboxChannelBeidouRDS2SignalStrength"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>RNSS卫星</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QGroupBox" name="groupBox_52">
<property name="title">
<string>直方图</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_70">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<layout class="QVBoxLayout" name="vboxChannelBeidouSignalStrength"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_51">
<property name="title">
<string>分布图</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_68">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<layout class="QVBoxLayout" name="vboxAzimuthMap"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
@@ -882,7 +1073,48 @@
<string>位置 </string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>天线 </string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="lblHydraulicCylinderHeight">
<property name="text">
<string>CCCCCCCCCCCCCCCCC</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="lblPhaseLockedLoop">
<property name="text">
<string>EEEEEEEEEEEEEEEEEE</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>锁相环 </string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="lblAntennaPowerSupply">
<property name="text">
<string>AAAAAAAAAAAAAAAAAAA</string>
</property>
</widget>
</item>
@@ -893,54 +1125,30 @@
</property>
</widget>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>液压杠升级高度 </string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>转台 </string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="lblHydraulicCylinderHeight">
<widget class="QLabel" name="lblZhuanTaiStatus">
<property name="text">
<string>CCCCCCCCCCCCCCCCC</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>天线 </string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="lblAntennaPowerSupply">
<property name="text">
<string>AAAAAAAAAAAAAAAAAAA</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>锁相环 </string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="lblPhaseLockedLoop">
<property name="text">
<string>EEEEEEEEEEEEEEEEEE</string>
<string>BBBBBBBBBBBBBBBBBBB</string>
</property>
</widget>
</item>
@@ -956,7 +1164,7 @@
<x>0</x>
<y>0</y>
<width>1893</width>
<height>21</height>
<height>18</height>
</rect>
</property>
</widget>

42
msg.cpp
View File

@@ -180,6 +180,48 @@ QByteArray pack_debug_cmd_CmdCtrl(uint8_t type, const std::string& cmd_content){
return pack_slip(cmd);
}
QByteArray pack_config_cmd_DefaultChannelAndNumberGet(){
QByteArray cmd(FRAME_MIN_LEN, '\0');
pack_len(cmd,2);
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdDefaultChannelAndNumber);
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kGetType);
calc_checksum(cmd);
return pack_slip(cmd);
}
QByteArray pack_config_cmd_DefaultChannelAndNumberSet(uint8_t type, const std::string& u_number, const std::string& s_number){
assert((u_number.size() <= 20) && (s_number.size() <= 20));
QByteArray cmd(FRAME_MIN_LEN + 1 + 20 + 20, '\0');
pack_len(cmd,2 + 1 + 20 + 20);
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdDefaultChannelAndNumber);
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kSetType);
cmd[COMMAND_DATA_BEGIN_INDEX] = type;
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX + 1],u_number.c_str(),u_number.size());
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX + 1 + 20],s_number.c_str(),s_number.size());
calc_checksum(cmd);
return pack_slip(cmd);
}
QByteArray pack_config_cmd_UDataChannelKeepTimeGet(){
QByteArray cmd(FRAME_MIN_LEN, '\0');
pack_len(cmd,2);
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdUDataChannelKeepTime);
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kGetType);
calc_checksum(cmd);
return pack_slip(cmd);
}
QByteArray pack_config_cmd_UDataChannelKeepTimeSet(uint16_t time){
QByteArray cmd(FRAME_MIN_LEN + 2, '\0');
pack_len(cmd,2 + 2);
cmd[COMMAND_TYPE_INDEX] = uint8_t(CommandType::kConfigCmdUDataChannelKeepTime);
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ConfigCommandType::kSetType);
cmd[COMMAND_DATA_BEGIN_INDEX] = (time >> 8) & 0xFF;
cmd[COMMAND_DATA_BEGIN_INDEX + 1] = time & 0xFF;
calc_checksum(cmd);
return pack_slip(cmd);
}
QByteArray pack_short_message_cmd(CommandType cmd_type,const std::string& number, const std::u16string& message){
assert(number.size() <= 20);
QByteArray cmd(FRAME_MIN_LEN+20+message.size()*sizeof(char16_t), '\0');

38
msg.h
View File

@@ -12,8 +12,9 @@
#define COMMAND_TYPE_INDEX 2
#define SUB_COMMAND_TYPE_INDEX 3
#define COMMAND_DATA_BEGIN_INDEX 4
#define FRAME_MIN_LEN 5
#define FRAME_MIN_LEN 5 //不含帧头帧尾
#define FRAME_LEN_STATUSREPORT (FRAME_MIN_LEN + 81)
#define FRAME_LEN_ZHUANTAISTATUSREPORT (FRAME_MIN_LEN + 6)
enum class CommandType : uint8_t{
kTianTongVoice = 0xA0,
@@ -23,6 +24,9 @@ enum class CommandType : uint8_t{
kBeiDouShortMessage = 0xB2,
kStatusReport = 0x80,
kSearchSatelliteStatusReport = 0x90,
kSearchZhuanTaiStatusReport = 0x91,
kConfigCmdDefaultChannelAndNumber = 0xD0,
kConfigCmdUDataChannelKeepTime = 0xD1,
kDebugCmd = 0xE0,
};
enum class TianTongVoiceSubCommandType: uint8_t{
@@ -43,6 +47,11 @@ enum class ShortMessageSubCommandType: uint8_t{
kRecvMessage = 0x02, //接收短消息
};
enum class SearchSatelliteStatusReportSubCommandType: uint8_t{
kRnss = 0x01, //RNSS卫星状态
kRdss = 0x02, //RDSS卫星状态
};
enum class VoiceAndShortMessageReponse{
kSucess = 0x00,
kFailure = 0x01,
@@ -98,6 +107,22 @@ enum class DebugCommandType: uint8_t{
kCmdCtrl = 0x06,
};
enum class ConfigCommandType: uint8_t{
kGetType = 0x00,
kSetType = 0x01,
};
enum class RDSSType: uint8_t{
RDSS_S1 = 0x00,
RDSS_S2 = 0x01,
};
enum class ChannelType: uint8_t{
ChannelS = 0x00,
ChannelUHF = 0x01,
ChannelAuto = 0x02,
};
struct SatelliteStatus{
uint8_t number;
uint8_t locate_flag;
@@ -106,6 +131,12 @@ struct SatelliteStatus{
uint8_t pitch;
};
struct RDSSSatelliteStatus{
uint8_t number;
uint8_t snr1;
uint8_t snr2;
};
void calc_checksum(QByteArray&cmd);
QByteArray pack_tiantong_dial_cmd(const std::string& number);
QByteArray pack_tiantong_hang_up_cmd();
@@ -124,6 +155,11 @@ QByteArray pack_debug_cmd_PASwitch(uint8_t s_switch, uint8_t u_switch, uint8_t b
QByteArray pack_debug_cmd_ZTCtrl(uint8_t type);
QByteArray pack_debug_cmd_CmdCtrl(uint8_t type, const std::string& cmd_content);
QByteArray pack_config_cmd_DefaultChannelAndNumberGet();
QByteArray pack_config_cmd_DefaultChannelAndNumberSet(uint8_t type, const std::string& u_number, const std::string& s_number);
QByteArray pack_config_cmd_UDataChannelKeepTimeGet();
QByteArray pack_config_cmd_UDataChannelKeepTimeSet(uint16_t time);
QByteArray pack_slip(QByteArray &message);
int pack_deslip(QByteArray &message);
QByteArray pack_tiantong_short_message_cmd(const std::string& number,const std::u16string& message);

21
res.qrc
View File

@@ -11,5 +11,26 @@
<file>res/last_page.png</file>
<file>res/next_page.png</file>
<file>res/previous_page.png</file>
<file>res/signal_4.png</file>
<file>res/module_error.png</file>
<file>res/m_card_no_stick.png</file>
<file>res/m_card_not_exist.png</file>
<file>res/m_card_stick.png</file>
<file>res/module_ok.png</file>
<file>res/module_update.png</file>
<file>res/s_signal_0.png</file>
<file>res/s_signal_1.png</file>
<file>res/s_signal_2.png</file>
<file>res/s_signal_3.png</file>
<file>res/s_signal_4.png</file>
<file>res/signal_0.png</file>
<file>res/signal_1.png</file>
<file>res/signal_2.png</file>
<file>res/signal_3.png</file>
<file>res/sim_card_exist.png</file>
<file>res/sim_card_not_exist.png</file>
<file>res/net_in_data.png</file>
<file>res/net_out.png</file>
<file>res/net_in_no_data.png</file>
</qresource>
</RCC>

BIN
res/m_card_no_stick.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 B

BIN
res/m_card_not_exist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
res/m_card_stick.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

BIN
res/module_error.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
res/module_ok.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

BIN
res/module_update.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
res/net_in_data.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
res/net_in_data2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
res/net_in_no_data.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
res/net_out.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
res/s_signal_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
res/s_signal_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
res/s_signal_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
res/s_signal_3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
res/s_signal_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
res/signal_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
res/signal_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
res/signal_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
res/signal_3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
res/signal_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
res/sim_card_exist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

BIN
res/sim_card_not_exist.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB