完善功能

This commit is contained in:
shuibing811
2025-07-04 17:44:45 +08:00
parent b3cb001103
commit 085233ab44
8 changed files with 1563 additions and 743 deletions

View File

@@ -18,9 +18,12 @@
#include <QScatterSeries>
#include <QSplineSeries>
#include <QStackedBarSeries>
#include <QSplitter>
#include <QToolTip>
#include <QtEndian>
#include <QLineEdit>
#include <QRegularExpressionValidator>>
#include "msg.h"
@@ -40,6 +43,17 @@ MainWindow::MainWindow(QWidget *parent)
createBeiDouSignalStrengthChart();
createAzimuthMapChart();
//
QSplitter *splitter = new QSplitter(Qt::Horizontal);
splitter->addWidget(ui->widgetCallAndMessage);
splitter->addWidget(ui->widgetSatelliteStatus);
setCentralWidget(splitter);
ui->lblPosition->clear();
ui->lblHydraulicCylinderHeight->clear();
ui->lblAntennaPowerSupply->clear();
ui->lblPhaseLockedLoop->clear();
//获取日志实例
m_logger = spdlog::get("logger");
@@ -52,12 +66,109 @@ MainWindow::MainWindow(QWidget *parent)
m_udpServerSocket = std::make_shared<QUdpSocket>();
m_udpServerSocket->bind(8000);
connect(&*m_udpServerSocket, &QUdpSocket::readyRead, this, &MainWindow::readPendingDatagrams);
// 对电话号码添加校验器
// QRegularExpression regExp("[0-9A-Za-z]{1,20}");
// QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this);
// // 获取 QComboBox 的 lineEdit 并设置校验器
// ui->cmbCallNumber->lineEdit()->setValidator(validator);
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(on_timer_timeout_1s()));
m_timer->start(1000);
//测试
test();
}
MainWindow::~MainWindow() { delete ui; }
void MainWindow::on_timer_timeout_1s(){
//模块状态
if(m_uhfModuleStatus == ModuleStatus::kChecking){
if(m_uhfModuleStatusGrayIcon){
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
}else{
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
}
m_uhfModuleStatusGrayIcon = !m_uhfModuleStatusGrayIcon;
}
if(m_tiantongModuleStatus == ModuleStatus::kChecking){
if(m_tiantongModuleStatusGrayIcon){
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
}else{
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
}
m_tiantongModuleStatusGrayIcon = !m_tiantongModuleStatusGrayIcon;
}
if(m_beidouModuleStatus == ModuleStatus::kChecking){
if(m_beidouModuleStatusGrayIcon){
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
}else{
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
}
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_tiantongSimCardStatus == SimCardStatus::kChecking){
if(m_tiantongSimCardStatusGrayIcon){
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
}else{
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
}
m_tiantongSimCardStatusGrayIcon = !m_tiantongSimCardStatusGrayIcon;
}
if(m_beidouSimCardStatus == SimCardStatus::kChecking){
if(m_beidouSimCardStatusGrayIcon){
ui->btnBeiDouSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
}else{
ui->btnBeiDouSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
}
m_beidouSimCardStatusGrayIcon = !m_beidouSimCardStatusGrayIcon;
}
//m卡状态
if(m_uhfMCardStatus == MCardStatus::kChecking){
if(m_uhfMCardStatusGrayIcon){
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
}else{
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
}
m_uhfMCardStatusGrayIcon = !m_uhfMCardStatusGrayIcon;
}
if(m_tiantongMCardStatus == MCardStatus::kChecking){
if(m_tiantongMCardStatusGrayIcon){
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
}else{
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
}
m_tiantongMCardStatusGrayIcon = !m_tiantongMCardStatusGrayIcon;
}
// 入网状态
if(m_uhfNetworkAccessStatus == NetworkAccessStatus::kConnecting){
if(m_uhfNetworkAccessStatusGrayIcon){
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
}else{
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
}
m_uhfNetworkAccessStatusGrayIcon = !m_uhfNetworkAccessStatusGrayIcon;
}
if(m_tiantongNetworkAccessStatus == NetworkAccessStatus::kConnecting){
if(m_tiantongNetworkAccessStatusGrayIcon){
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
}else{
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
}
m_tiantongNetworkAccessStatusGrayIcon = !m_tiantongNetworkAccessStatusGrayIcon;
}
}
void MainWindow::keyPressEvent(QKeyEvent* event){
if(event->key() == Qt::Key_L && event->modifiers() & Qt::ControlModifier){
m_loggerWidget->show();
@@ -67,23 +178,27 @@ void MainWindow::keyPressEvent(QKeyEvent* event){
}
void MainWindow::StartupTalkingTimer(){
if(m_timer){
m_timer->stop();
if(m_talkingTimer){
if(m_talkingTimer->isActive()){
return;
}
m_callDuration = 0;
m_talkingTimer->start(1000);
}else{
m_timer = std::make_shared<QTimer>();
QObject::connect(&*m_timer, &QTimer::timeout, [this]() {
m_talkingTimer = std::make_shared<QTimer>();
QObject::connect(&*m_talkingTimer, &QTimer::timeout, [this]() {
m_callDuration += 1;
QTime t(0,0,0);
t = t.addSecs(m_callDuration);
ui->lblCallDuration->setText(t.toString("hh:mm:ss"));
});
m_callDuration = 0;
m_talkingTimer->start(1000);
}
m_callDuration = 0;
m_timer->start(1000);
}
void MainWindow::ShutdownTalkingTimer(){
if(m_timer){
m_timer->stop();
if(m_talkingTimer){
m_talkingTimer->stop();
}
}
@@ -423,6 +538,7 @@ void MainWindow::UpdateMessageList() {
int column_index = 0;
// 读取状态
auto item = new QTableWidgetItem(r.isUnread ? "未读" : "已读");
item->setData(Qt::UserRole,index);
item->setTextAlignment(Qt::AlignCenter);
if(r.isUnread){
item->setBackground(Qt::cyan);
@@ -463,92 +579,139 @@ void MainWindow::UpdateMessageList() {
//--------------------------------------------------------------------------------------
// 槽函数
//--------------------------------------------------------------------------------------
void MainWindow::on_rdbChannelUHF_clicked() {
ui->cmbCallNumber->setEnabled(true);
ui->btnCallAnswer->setEnabled(true);
}
void MainWindow::on_rdbChannelS_clicked() {
ui->cmbCallNumber->setEnabled(true);
ui->btnCallAnswer->setEnabled(true);
}
void MainWindow::on_rdbChannelBeiDou_clicked() {
if (m_callStatus == CallStatus::kIdle) {
ui->cmbCallNumber->setEnabled(false);
}
}
void MainWindow::on_rdbChannelAuto_clicked() {
ui->cmbCallNumber->setEnabled(true);
ui->btnCallAnswer->setEnabled(true);
}
void MainWindow::on_btnCallAnswer_clicked() {
switch (m_callStatus) {
case CallStatus::kIdle: {
// 检查电话号码是否为空
QString number = ui->cmbCallNumber->currentText();
if (number.isEmpty()) { // TODO:进一步判断电话号码格式是否满足要求
QMessageBox::information(this, "错误", "请输入电话号码");
return;
}
// TODO: 检查电话号码格式是否满足要求,比如长度
// 呼叫
call(number);
} break;
case CallStatus::kCallIsComing:
// 接听
acceptCall();
break;
default:
break;
}
}
void MainWindow::on_btnCallReject_clicked() {
switch (m_callStatus) {
case CallStatus::kIdle:
break;
case CallStatus::kDialing://拨号中
// 挂断
hangUpCall();
break;
case CallStatus::kCallIsComing://来电中
// 拒接
rejectCall();
break;
case CallStatus::kOnLine://通话中
// 挂断
hangUpCall();
break;
}
}
void MainWindow::on_btnSendMessage_clicked() {
// 检查电话号码是否为空
QString number = ui->cmbMessageNumber->currentText();
bool MainWindow::checkNumber(const QString& number){
if (number.isEmpty()) {
QMessageBox::information(this, "错误", "请输入电话号码");
return;
return false;
}
// TODO: 检查电话号码格式是否满足要求,比如长度
//检查号码长度
if (number.size() > 20){
QMessageBox::information(this, "错误", "电话号码长度不能超过20");
return false;
}
// TODO: 检查电话号码格式是否满足要求
return true;
}
bool MainWindow::checkMessage(const QString& message){
// 检查消息是否为空
QString message = ui->txtMessageContent->toPlainText();
if (message.isEmpty()) {
QMessageBox::information(this, "错误", "请输入要发送的消息");
return;
return false;
}
// 检查消息长度
if (message.length() > 140) {
QMessageBox::information(this, "错误", "消息太长不能超过140个字符");
return false;
}
// 发送信息
sendShortMessage(number, message);
return true;
}
std::pair<bool,Channel> MainWindow::selectChannel(CommType comm_type){
//TODO: 是否区别通话还是短信,入网状态的数据是否激活对发送短信是否有影响???
bool isUhfChannelOk = (m_uhfModuleStatus == ModuleStatus::kChecking || m_uhfModuleStatus == ModuleStatus::kNormal)
&& (m_uhfSimCardStatus == SimCardStatus::kExist || m_uhfSimCardStatus == SimCardStatus::kChecking)
&& (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)
&& (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);
}
}
}
void MainWindow::on_btnCallAnswer_clicked() {
if(m_uhfCallStatus == CallStatus::kIdle && m_tiantongCallStatus == CallStatus::kIdle){
// 检查电话号码是否为空
QString number = ui->cmbCallNumber->currentText();
if(!checkNumber(number)){
return;
}
// 呼叫
if(ui->rdbChannelUHF->isChecked()){
sendUdpMessage(pack_uhf_dial_cmd(number.toStdString()));
}else if(ui->rdbChannelS->isChecked()){
sendUdpMessage(pack_tiantong_dial_cmd(number.toStdString()));
}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()));
}
}
}
if(m_uhfCallStatus == CallStatus::kCallIsComing){
sendUdpMessage(pack_uhf_answer());
}else if(m_tiantongCallStatus == CallStatus::kCallIsComing){
sendUdpMessage(pack_tiantong_answer());
}
}
void MainWindow::on_btnCallReject_clicked() {
if(m_uhfCallStatus != CallStatus::kIdle){
sendUdpMessage(pack_uhf_hang_up_cmd());
}
if(m_tiantongCallStatus != CallStatus::kIdle){
sendUdpMessage(pack_tiantong_hang_up_cmd());
}
}
void MainWindow::on_btnSendMessageByUhfOrS_clicked() {
QString number = ui->cmbMessageNumberForUhfAndS->currentText();
if(!checkNumber(number)){
return;
}
QString message = ui->txtMessageContentForUhfAndS->toPlainText();
if(!checkMessage(message)){
return;
}
// 发送信息
if(ui->rdbChannelUHF->isChecked()){
sendUdpMessage(pack_uhf_short_message_cmd(number.toStdString(),message.toStdU16String()));
}else if(ui->rdbChannelS->isChecked()){
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()));
}
}
}
void MainWindow::on_btnSendMessageByBeiDou_clicked()
{
test1();
return;
QString number = ui->cmbMessageNumberForBeiDou->currentText();
if(!checkNumber(number)){
return;
}
QString message = ui->txtMessageContentForBeiDou->toPlainText();
if(!checkMessage(message)){
return;
}
sendUdpMessage(pack_beidou_short_message_cmd(number.toStdString(),message.toStdU16String()));
}
void MainWindow::on_tblMessageList_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
{
@@ -556,9 +719,10 @@ void MainWindow::on_tblMessageList_currentItemChanged(QTableWidgetItem *current,
if(currentRow == -1){
ui->txtCurrentItemMessageContent->clear();
}else{
ui->txtCurrentItemMessageContent->setText(m_msgList[currentRow].content);
if(m_msgList[currentRow].isUnread){
m_msgList[currentRow].isUnread = false;
int index = ui->tblMessageList->item(currentRow,0)->data(Qt::UserRole).toInt();
ui->txtCurrentItemMessageContent->setText(m_msgList[index].content);
if(m_msgList[index].isUnread){
m_msgList[index].isUnread = false;
ui->tblMessageList->item(currentRow,0)->setText("已读");
ui->tblMessageList->item(currentRow,0)->setBackground(Qt::white);
--m_unReadMsgCount;
@@ -567,7 +731,6 @@ void MainWindow::on_tblMessageList_currentItemChanged(QTableWidgetItem *current,
}
}
void MainWindow::on_btnRecordQuery_clicked() {
m_recordQueryWidget->show();
}
@@ -579,37 +742,11 @@ bool MainWindow::sendUdpMessage(const QByteArray &udpMessage) {
quint16 port = 8080;
if (m_udpSocket->writeDatagram(udpMessage, address, port) !=
udpMessage.size()) {
// 发送错误
m_logger->error("发送udp消息错误");
return false;
}
return true;
}
bool MainWindow::call(const QString &number) {
// TODO:
QString udpMessage = "";
return sendUdpMessage(udpMessage.toUtf8());
}
bool MainWindow::hangUpCall() {
// TODO:
QString udpMessage = "";
return sendUdpMessage(udpMessage.toUtf8());
}
bool MainWindow::acceptCall() {
// TODO:
QString udpMessage = "";
return sendUdpMessage(udpMessage.toUtf8());
}
bool MainWindow::rejectCall() {
// TODO:
QString udpMessage = "";
return sendUdpMessage(udpMessage.toUtf8());
}
bool MainWindow::sendShortMessage(const QString &number,
const QString &message) {
// TODO:
QString udpMessage = "";
return sendUdpMessage(udpMessage.toUtf8());
}
//--------------------------------------------------------------------------------------
// 处理命令
//--------------------------------------------------------------------------------------
@@ -640,36 +777,6 @@ void MainWindow::processCommand(const QByteArray& cmd){
processSearchSatelliteStatusReport(cmd);
break;
}
//有来电
ui->cmbCallNumber->setEnabled(false);
ui->btnCallAnswer->show();
ui->btnCallReject->show();
ui->lblCallStatus->setText("来电中...");
ui->lblCallDuration->hide();
//通话中
ui->cmbCallNumber->setEnabled(false);
ui->btnCallAnswer->hide();
ui->btnCallReject->show();
ui->lblCallStatus->setText("通话中...");
ui->lblCallDuration->show();
StartupTalkingTimer();
//挂断电话
ui->cmbCallNumber->setEnabled(true);
ui->btnCallAnswer->show();
ui->btnCallReject->hide();
ui->lblCallStatus->setText("空闲中...");
ui->lblCallDuration->hide();
ShutdownTalkingTimer();
//拨号中
ui->cmbCallNumber->setEnabled(false);
ui->btnCallAnswer->hide();
ui->btnCallReject->show();
ui->lblCallStatus->setText("拨号中...");
ui->lblCallDuration->hide();
test1();
}
void MainWindow::processTianTongVoiceCmd(const QByteArray& cmd){
switch(cmd[SUB_COMMAND_TYPE_INDEX]){
@@ -777,7 +884,7 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
int data_index = COMMAND_DATA_BEGIN_INDEX;
//uhf状态
uint8_t uhf_module_status = cmd[data_index++];//模块状态
uint8_t uhf_connected_network_status = cmd[data_index++];//入网状态
uint8_t uhf_network_access_status = cmd[data_index++];//入网状态
uint8_t uhf_sim_card_status = cmd[data_index++];//sim卡状态
uint8_t uhf_m_card_status = cmd[data_index++];//m卡状态
uint8_t uhf_call_status = cmd[data_index++];//通话状态
@@ -786,13 +893,14 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
data_index += 20;
//天通状态
uint8_t tiantong_module_status = cmd[data_index++];//模块状态
uint8_t tiantong_connected_network_status = cmd[data_index++];//入网状态
uint8_t tiantong_network_access_status = cmd[data_index++];//入网状态
uint8_t tiantong_sim_card_status = cmd[data_index++];//sim卡状态
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);
data_index += 20;
//北斗状态
uint8_t beidou_module_status = cmd[data_index++];//模块状态
uint8_t beidou_sim_card_status = cmd[data_index++];//sim卡状态
@@ -832,6 +940,53 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
//UHF接收锁相环频综状态
uint8_t phase_locked_loop_recv = cmd[data_index++];
//处理模块状态
processUhfModuleStatus(uhf_module_status);
processTianTongModuleStatus(tiantong_module_status);
processBeiDouModuleStatus(beidou_module_status);
//处理入网状态
processUhfNetworkAccessStatus(uhf_network_access_status);
processTianTongNetworkAccessStatus(tiantong_network_access_status);
// 处理sim卡状态
processUhfSimCardStatus(uhf_sim_card_status);
processTianTongSimCardStatus(tiantong_sim_card_status);
processBeiDouSimCardStatus(beidou_sim_card_status);
// 处理m卡状态
processUhfMCardStatus(uhf_m_card_status);
processTianTongMCardStatus(tiantong_m_card_status);
//处理呼叫状态
processCallStatus(tiantong_call_status,uhf_call_status);
// 处理信号强度,信号强度范围是否是0~100之间???
m_uhfSignalStrength = uhf_satellite_signal_strength;
m_tiantongSignalStrength = tiantong_satellite_signal_strength;
ui->progressChannelUHFSignalStrength->setValue(m_uhfSignalStrength);
ui->progressChannelSSignalStrength->setValue(m_tiantongSignalStrength);
// 处理来电号码
if(!uhf_number.empty()){
ui->cmbCallNumber->setCurrentText(QString::fromStdString(uhf_number));
}else{
ui->cmbCallNumber->setCurrentText(QString::fromStdString(tiantong_number));
}
// 处理位置
ui->lblPosition->setText(QString(" 经度: %1, 纬度: %2, 高度, %3").arg(longitude).arg(latitude).arg(altitude));
// 处理液压缸升降高度状态
ui->lblHydraulicCylinderHeight->setText(QString("%1 米").arg(oil_level_position));
// 处理自检状态
ui->lblAntennaPowerSupply->setText(QString("电源A电压 %1 V, 电源A电流 %2 A, 电源B电压 %1 V, 电源B电流 %2 A")
.arg(antenna_power_supply_a_voltage).arg(antenna_power_supply_a_current)
.arg(antenna_power_supply_b_voltage).arg(antenna_power_supply_b_current));
QString s;
if(phase_locked_loop_send == uint8_t(PhaseLockedLoopStatus::kLocked) || phase_locked_loop_send == uint8_t(PhaseLockedLoopStatus::kUnlocked)){
s = QString("UHF发送锁相环频综: %1 ").arg(phase_locked_loop_send == uint8_t(PhaseLockedLoopStatus::kLocked)?"锁定":"失锁");
}else{
m_logger->error("UHF发送锁相环频综非法值, phase_locked_loop_send = {}",phase_locked_loop_send);
}
if(phase_locked_loop_recv == uint8_t(PhaseLockedLoopStatus::kLocked) || phase_locked_loop_recv == uint8_t(PhaseLockedLoopStatus::kUnlocked)){
s += QString("UHF接收锁相环频综: %1").arg(phase_locked_loop_recv == uint8_t(PhaseLockedLoopStatus::kLocked)?"锁定":"失锁");
}else{
m_logger->error("UHF接收锁相环频综非法值, phase_locked_loop_recv = {}",phase_locked_loop_recv);
}
ui->lblPhaseLockedLoop->setText(s);
}
void MainWindow::processSearchSatelliteStatusReport(const QByteArray& cmd){
if(cmd[SUB_COMMAND_TYPE_INDEX] != 0){
@@ -852,6 +1007,324 @@ void MainWindow::processSearchSatelliteStatusReport(const QByteArray& cmd){
status.pitch = cmd[data_index++];//卫星俯仰角
all_satellite_status.push_back(status);
}
// 处理卫星状态
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));
}
// 设置信号能量
setSignalStrengthValues(categories,yValues);
// 设置方位俯仰角
setAzimuthValues(azimuth_pitch_values);
}
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
// 处理模块状态
void MainWindow::processUhfModuleStatus(uint8_t status){
if(status != uint8_t(ModuleStatus::kChecking) && status != uint8_t(ModuleStatus::kNormal)
&& status != uint8_t(ModuleStatus::kFault) && status != uint8_t(ModuleStatus::kUpgrading)){
m_logger->error("UHF模块状态非法值, status = {}",status);
return;
}
m_uhfModuleStatus = ModuleStatus(status);
switch(m_uhfModuleStatus){
case ModuleStatus::kChecking:
ui->btnUHFModuleStatus->setToolTip("检测中");
break;
case ModuleStatus::kNormal:
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnUHFModuleStatus->setToolTip("正常");
break;
case ModuleStatus::kFault:
ui->btnUHFModuleStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnUHFModuleStatus->setToolTip("故障");
break;
case ModuleStatus::kUpgrading:
ui->btnUHFModuleStatus->setToolTip("升级中");
break;
}
}
void MainWindow::processTianTongModuleStatus(uint8_t status){
if(status != uint8_t(ModuleStatus::kChecking) && status != uint8_t(ModuleStatus::kNormal)
&& status != uint8_t(ModuleStatus::kFault) && status != uint8_t(ModuleStatus::kUpgrading)){
m_logger->error("天通模块状态非法值, status = {}",status);
return;
}
m_tiantongModuleStatus = ModuleStatus(status);
switch(m_tiantongModuleStatus){
case ModuleStatus::kChecking:
ui->btnSModueStatus->setToolTip("检测中");
break;
case ModuleStatus::kNormal:
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnSModueStatus->setToolTip("正常");
break;
case ModuleStatus::kFault:
ui->btnSModueStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnSModueStatus->setToolTip("故障");
break;
case ModuleStatus::kUpgrading:
ui->btnSModueStatus->setToolTip("升级中");
break;
}
}
void MainWindow::processBeiDouModuleStatus(uint8_t status){
if(status != uint8_t(ModuleStatus::kChecking) && status != uint8_t(ModuleStatus::kNormal)
&& status != uint8_t(ModuleStatus::kFault) && status != uint8_t(ModuleStatus::kUpgrading)){
m_logger->error("北斗模块状态非法值, status = {}",status);
return;
}
m_beidouModuleStatus = ModuleStatus(status);
switch(m_beidouModuleStatus){
case ModuleStatus::kChecking:
ui->btnBeiDouModuleStatus->setToolTip("检测中");
break;
case ModuleStatus::kNormal:
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnBeiDouModuleStatus->setToolTip("正常");
break;
case ModuleStatus::kFault:
ui->btnBeiDouModuleStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnBeiDouModuleStatus->setToolTip("故障");
break;
case ModuleStatus::kUpgrading:
ui->btnBeiDouModuleStatus->setToolTip("升级中");
break;
}
}
// 处理SIM卡状态
void MainWindow::processUhfSimCardStatus(uint8_t status){
if(status != uint8_t(SimCardStatus::kChecking) && status != uint8_t(SimCardStatus::kExist)
&& status != uint8_t(SimCardStatus::kNotExist)){
m_logger->error("UHF SIM卡状态非法值, status = {}",status);
return;
}
m_uhfSimCardStatus = SimCardStatus(status);
switch(m_uhfSimCardStatus){
case SimCardStatus::kChecking:
ui->btnUHFSimCardStatus->setToolTip("正在检测");
break;
case SimCardStatus::kExist:
ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnUHFSimCardStatus->setToolTip("存在");
break;
case SimCardStatus::kNotExist:
ui->btnUHFSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnUHFSimCardStatus->setToolTip("不存在");
break;
}
}
void MainWindow::processTianTongSimCardStatus(uint8_t status){
if(status != uint8_t(SimCardStatus::kChecking) && status != uint8_t(SimCardStatus::kExist)
&& status != uint8_t(SimCardStatus::kNotExist)){
m_logger->error("UHF SIM卡状态非法值, status = {}",status);
return;
}
m_tiantongSimCardStatus = SimCardStatus(status);
switch(m_tiantongSimCardStatus){
case SimCardStatus::kChecking:
ui->btnSSimCardStatus->setToolTip("正在检测");
break;
case SimCardStatus::kExist:
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnSSimCardStatus->setToolTip("存在");
break;
case SimCardStatus::kNotExist:
ui->btnSSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnSSimCardStatus->setToolTip("不存在");
break;
}
}
void MainWindow::processBeiDouSimCardStatus(uint8_t status){
if(status != uint8_t(SimCardStatus::kChecking) && status != uint8_t(SimCardStatus::kExist)
&& status != uint8_t(SimCardStatus::kNotExist)){
m_logger->error("UHF SIM卡状态非法值, status = {}",status);
return;
}
m_beidouSimCardStatus = SimCardStatus(status);
switch(m_beidouSimCardStatus){
case SimCardStatus::kChecking:
ui->btnBeiDouSimCardStatus->setToolTip("正在检测");
break;
case SimCardStatus::kExist:
ui->btnBeiDouSimCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnBeiDouSimCardStatus->setToolTip("存在");
break;
case SimCardStatus::kNotExist:
ui->btnBeiDouSimCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnBeiDouSimCardStatus->setToolTip("不存在");
break;
}
}
// 处理M卡状态
void MainWindow::processUhfMCardStatus(uint8_t status){
if(status != uint8_t(MCardStatus::kChecking) && status != uint8_t(MCardStatus::kExistNotEncryted)
&& status != uint8_t(MCardStatus::kExistEncryted)&& status != uint8_t(MCardStatus::kNotExist)){
m_logger->error("UHF M卡状态非法值, status = {}",status);
return;
}
m_uhfMCardStatus = MCardStatus(status);
switch(m_uhfMCardStatus){
case MCardStatus::kChecking:
ui->btnUHFMCardStatus->setToolTip("正在检测");
break;
case MCardStatus::kExistNotEncryted:
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnUHFMCardStatus->setToolTip("存在未注密");
break;
case MCardStatus::kExistEncryted:
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnUHFMCardStatus->setToolTip("存在已注密");
break;
case MCardStatus::kNotExist:
ui->btnUHFMCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnUHFMCardStatus->setToolTip("不存在");
break;
}
}
void MainWindow::processTianTongMCardStatus(uint8_t status){
if(status != uint8_t(MCardStatus::kChecking) && status != uint8_t(MCardStatus::kExistNotEncryted)
&& status != uint8_t(MCardStatus::kExistEncryted)&& status != uint8_t(MCardStatus::kNotExist)){
m_logger->error("天通M卡状态非法值, status = {}",status);
return;
}
m_tiantongMCardStatus = MCardStatus(status);
switch(m_tiantongMCardStatus){
case MCardStatus::kChecking:
ui->btnSMCardStatus->setToolTip("正在检测");
break;
case MCardStatus::kExistNotEncryted:
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnSMCardStatus->setToolTip("存在未注密");
break;
case MCardStatus::kExistEncryted:
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/card_green.png"));
ui->btnSMCardStatus->setToolTip("存在已注密");
break;
case MCardStatus::kNotExist:
ui->btnSMCardStatus->setIcon(QIcon(":/rc/res/card_gray.png"));
ui->btnSMCardStatus->setToolTip("不存在");
break;
}
}
// 处理网络访问状态
void MainWindow::processUhfNetworkAccessStatus(uint8_t status){
if(status != uint8_t(NetworkAccessStatus::kNotConnected)
&& status != uint8_t(NetworkAccessStatus::kConnecting)
&& status != uint8_t(NetworkAccessStatus::kConnectedDataIsNotActivated)
&& status != uint8_t(NetworkAccessStatus::kConnectedDataIsActivated)){
m_logger->error("uhf 入网状态非法值, status = {}",status);
}
m_uhfNetworkAccessStatus = NetworkAccessStatus(status);
switch(m_uhfNetworkAccessStatus){
case NetworkAccessStatus::kNotConnected:
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.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->setToolTip("已入网, 数据未激活");
break;
case NetworkAccessStatus::kConnectedDataIsActivated:
ui->btnUHFNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnUHFNetworkAccessStatus->setToolTip("已入网, 数据已激活");
break;
}
}
void MainWindow::processTianTongNetworkAccessStatus(uint8_t status){
if(status == uint8_t(NetworkAccessStatus::kNotConnected)
&& status == uint8_t(NetworkAccessStatus::kConnecting)
&& status == uint8_t(NetworkAccessStatus::kConnectedDataIsNotActivated)
&& status == uint8_t(NetworkAccessStatus::kConnectedDataIsActivated)){
m_logger->error("天通入网状态非法值, status = {}",status);
}
m_tiantongNetworkAccessStatus = NetworkAccessStatus(status);
switch(m_tiantongNetworkAccessStatus){
case NetworkAccessStatus::kNotConnected:
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnSNetworkAccessStatus->setToolTip("未入网");
break;
case NetworkAccessStatus::kConnecting:
// ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_gray.png"));
ui->btnSNetworkAccessStatus->setToolTip("正在入网");
break;
case NetworkAccessStatus::kConnectedDataIsNotActivated:
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnSNetworkAccessStatus->setToolTip("已入网, 数据未激活");
break;
case NetworkAccessStatus::kConnectedDataIsActivated:
ui->btnSNetworkAccessStatus->setIcon(QIcon(":/rc/res/circle_green.png"));
ui->btnSNetworkAccessStatus->setToolTip("已入网, 数据已激活");
break;
}
}
// 处理呼叫状态
void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call_status){
if(tiantong_call_status != uint8_t(CallStatus::kIdle) && tiantong_call_status != uint8_t(CallStatus::kDialing)
&& tiantong_call_status != uint8_t(CallStatus::kPeerRingTheBell) && tiantong_call_status != uint8_t(CallStatus::kOnLine)
&& tiantong_call_status != uint8_t(CallStatus::kCallIsComing)){
return;
}
if(uhf_call_status != uint8_t(CallStatus::kIdle) && uhf_call_status != uint8_t(CallStatus::kDialing)
&& uhf_call_status != uint8_t(CallStatus::kPeerRingTheBell) && uhf_call_status != uint8_t(CallStatus::kOnLine)
&& uhf_call_status != uint8_t(CallStatus::kCallIsComing)){
return;
}
CallStatus m_tiantongCallStatus = CallStatus(tiantong_call_status);
CallStatus m_uhfCallStaus = CallStatus(uhf_call_status);
//TODO: 会不会有冲突的情况?
CallStatus status;
if(m_tiantongCallStatus != CallStatus::kIdle){
status = m_tiantongCallStatus;
}else{
status = m_uhfCallStaus;
}
switch(status){
case CallStatus::kIdle://空闲
//挂断电话
ui->cmbCallNumber->setEnabled(true);
ui->btnCallAnswer->show();
ui->btnCallReject->hide();
ui->lblCallStatus->setText("空闲中...");
ui->lblCallDuration->hide();
ShutdownTalkingTimer();
break;
case CallStatus::kDialing://拨号中
case CallStatus::kPeerRingTheBell://对方振铃
//拨号中
ui->cmbCallNumber->setEnabled(false);
ui->btnCallAnswer->hide();
ui->btnCallReject->show();
ui->lblCallStatus->setText("拨号中...");
ui->lblCallDuration->hide();
break;
case CallStatus::kOnLine://通话中
//通话中
ui->cmbCallNumber->setEnabled(false);
ui->btnCallAnswer->hide();
ui->btnCallReject->show();
ui->lblCallStatus->setText("通话中...");
ui->lblCallDuration->show();
StartupTalkingTimer();
break;
case CallStatus::kCallIsComing://来电中
//有来电
ui->cmbCallNumber->setEnabled(false);
ui->btnCallAnswer->show();
ui->btnCallReject->show();
ui->lblCallStatus->setText("来电中...");
ui->lblCallDuration->hide();
break;
}
}
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------

View File

@@ -27,6 +27,7 @@ class QChart;
class QBarCategoryAxis;
class QValueAxis;
class QTableWidgetItem;
class MainWindow : public QMainWindow
{
Q_OBJECT
@@ -36,26 +37,24 @@ public:
~MainWindow();
void test1();
private slots:
void on_rdbChannelUHF_clicked();
void on_rdbChannelS_clicked();
void on_rdbChannelBeiDou_clicked();
void on_rdbChannelAuto_clicked();
void on_btnCallAnswer_clicked();
void on_btnCallReject_clicked();
void on_btnSendMessage_clicked();
void on_btnSendMessageByUhfOrS_clicked();
void on_btnSendMessageByBeiDou_clicked();
void on_btnRecordQuery_clicked();
void readPendingDatagrams();
void on_tblMessageList_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous);
void handleHovered(bool status, int index, QBarSet *barset);
void on_timer_timeout_1s();
protected:
void keyPressEvent(QKeyEvent* event) override;
private:
@@ -71,10 +70,6 @@ private:
// 与底层消息交互
//-------------------------------------------------
bool sendUdpMessage(const QByteArray &udpMessage);
bool call(const QString& number);
bool hangUpCall();
bool acceptCall();
bool rejectCall();
bool sendShortMessage(const QString &number,const QString& message);
void processCommand(const QByteArray& cmd);
void processTianTongVoiceCmd(const QByteArray& cmd);
@@ -85,16 +80,73 @@ private:
void processStatusReportCmd(const QByteArray& cmd);
void processSearchSatelliteStatusReport(const QByteArray& cmd);
// 处理模块状态
void processUhfModuleStatus(uint8_t status);
void processTianTongModuleStatus(uint8_t status);
void processBeiDouModuleStatus(uint8_t status);
// 处理SIM卡状态
void processUhfSimCardStatus(uint8_t status);
void processTianTongSimCardStatus(uint8_t status);
void processBeiDouSimCardStatus(uint8_t status);
// 处理M卡状态
void processUhfMCardStatus(uint8_t status);
void processTianTongMCardStatus(uint8_t status);
// 处理网络访问状态
void processUhfNetworkAccessStatus(uint8_t status);
void processTianTongNetworkAccessStatus(uint8_t status);
void processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call_status);
void StartupTalkingTimer();
void ShutdownTalkingTimer();
void test();
std::pair<bool,Channel> selectChannel(CommType comm_type);
bool checkNumber(const QString& number);
bool checkMessage(const QString& message);
private:
Ui::MainWindow *ui;
CallStatus m_callStatus = CallStatus::kIdle;
// 呼叫状态
CallStatus m_tiantongCallStatus{CallStatus::kIdle};
CallStatus m_uhfCallStatus{CallStatus::kIdle};
// 信号强度
uint8_t m_uhfSignalStrength{0};
uint8_t m_tiantongSignalStrength{0};
// 模块状态
ModuleStatus m_uhfModuleStatus{ModuleStatus::kFault};
ModuleStatus m_tiantongModuleStatus{ModuleStatus::kFault};
ModuleStatus m_beidouModuleStatus{ModuleStatus::kFault};
bool m_uhfModuleStatusGrayIcon = true;
bool m_tiantongModuleStatusGrayIcon = true;
bool m_beidouModuleStatusGrayIcon = true;
// SIM卡状态
SimCardStatus m_uhfSimCardStatus{SimCardStatus::kNotExist};
SimCardStatus m_tiantongSimCardStatus{SimCardStatus::kNotExist};
SimCardStatus m_beidouSimCardStatus{SimCardStatus::kNotExist};
bool m_uhfSimCardStatusGrayIcon = true;
bool m_tiantongSimCardStatusGrayIcon = true;
bool m_beidouSimCardStatusGrayIcon = true;
// M卡状态
MCardStatus m_uhfMCardStatus{MCardStatus::kNotExist};
MCardStatus m_tiantongMCardStatus{MCardStatus::kNotExist};
bool m_uhfMCardStatusGrayIcon = true;
bool m_tiantongMCardStatusGrayIcon = true;
// 网络访问状态
NetworkAccessStatus m_uhfNetworkAccessStatus{NetworkAccessStatus::kNotConnected};
NetworkAccessStatus m_tiantongNetworkAccessStatus{NetworkAccessStatus::kNotConnected};
NetworkAccessStatus m_beidouNetworkAccessStatus{NetworkAccessStatus::kNotConnected};
bool m_uhfNetworkAccessStatusGrayIcon = true;
bool m_tiantongNetworkAccessStatusGrayIcon = true;
bool m_beidouNetworkAccessStatusGrayIcon = true;
std::vector<Record> m_msgList;
int m_unReadMsgCount = 0;
int m_callDuration = 0;
std::shared_ptr<QTimer> m_timer;
QTimer* m_timer;
std::shared_ptr<QTimer> m_talkingTimer;
std::shared_ptr<spdlog::logger> m_logger;
std::shared_ptr<QUdpSocket> m_udpSocket;
std::shared_ptr<QUdpSocket> m_udpServerSocket;

File diff suppressed because it is too large Load Diff

10
msg.cpp
View File

@@ -65,23 +65,23 @@ QByteArray pack_uhf_answer(){
return cmd;
}
QByteArray pack_short_message_cmd(CommandType cmd_type,const std::string& number, const std::string& message){
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(), '\0');
pack_len(cmd,2 + 20 + message.size());
cmd[COMMAND_TYPE_INDEX] = uint8_t(cmd_type);
cmd[SUB_COMMAND_TYPE_INDEX] = uint8_t(ShortMessageSubCommandType::kSendMessage);
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX],number.c_str(),number.size());
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX+20],message.c_str(),message.size());
memcpy(&cmd[COMMAND_DATA_BEGIN_INDEX+20],message.c_str(),message.size()*sizeof(char16_t));
return cmd;
}
QByteArray pack_tiantong_short_message_cmd(const std::string& number, const std::string& message){
QByteArray pack_tiantong_short_message_cmd(const std::string& number, const std::u16string& message){
return pack_short_message_cmd(CommandType::kTianTongShortMessage,number,message);
}
QByteArray pack_uhf_short_message_cmd(const std::string& number, const std::string& message){
QByteArray pack_uhf_short_message_cmd(const std::string& number, const std::u16string& message){
return pack_short_message_cmd(CommandType::kUhfShortMessage,number,message);
}
QByteArray pack_beidou_short_message_cmd(const std::string& number, const std::string& message){
QByteArray pack_beidou_short_message_cmd(const std::string& number, const std::u16string& message){
return pack_short_message_cmd(CommandType::kBeiDouShortMessage,number,message);
}

10
msg.h
View File

@@ -48,7 +48,7 @@ enum class ModuleStatus: uint8_t{
kUpgrading = 0x03, //升级中
};
enum class ConnectedNetworkStatus: uint8_t{
enum class NetworkAccessStatus: uint8_t{
kNotConnected = 0x00, //未入网
kConnecting = 0x01, //正在入网
kConnectedDataIsNotActivated = 0x02, //已入网, 数据未激活
@@ -64,7 +64,7 @@ enum class SimCardStatus: uint8_t{
enum class MCardStatus: uint8_t{
kChecking = 0x00,//正在检测
kExistNotEncryted = 0x01,//存在未注密
kExistEncryted = 0x02,//存在已注密
kExistEncryted = 0x02,//存在已注密
kNotExist = 0x03,//不存在
};
@@ -98,9 +98,9 @@ QByteArray pack_uhf_dial_cmd(const std::string& number);
QByteArray pack_uhf_hang_up_cmd();
QByteArray pack_uhf_answer();
QByteArray pack_tiantong_short_message_cmd(const std::string& number,const std::string& message);
QByteArray pack_uhf_short_message_cmd(const std::string& number, const std::string& message);
QByteArray pack_beidou_short_message_cmd(const std::string& number, const std::string& message);
QByteArray pack_tiantong_short_message_cmd(const std::string& number,const std::u16string& message);
QByteArray pack_uhf_short_message_cmd(const std::string& number, const std::u16string& message);
QByteArray pack_beidou_short_message_cmd(const std::string& number, const std::u16string& message);
#endif // MSG_H

View File

@@ -3,8 +3,8 @@
<file>res/call_cancelled.png</file>
<file>res/circle_gray.png</file>
<file>res/circle_green.png</file>
<file>res/sim_gray.png</file>
<file>res/sim_green.png</file>
<file>res/card_gray.png</file>
<file>res/card_green.png</file>
<file>res/call_accepted.png</file>
<file>res/call_gray.png</file>
<file>res/first_page.png</file>

View File

Before

Width:  |  Height:  |  Size: 407 B

After

Width:  |  Height:  |  Size: 407 B

View File

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 433 B