修改了一些问题

This commit is contained in:
shuibing811
2025-07-08 12:03:32 +08:00
parent 856417c501
commit 1d5c55ae6a
3 changed files with 117 additions and 55 deletions

View File

@@ -15,6 +15,11 @@ RecordQuery::RecordQuery(QWidget *parent)
ui->setupUi(this);
InitDatabase();
m_logger = spdlog::get("logger");
QDateTime current = QDateTime::currentDateTime();
ui->dteBeginTime->setDateTime(current.addYears(-1));
QDate today = QDate::currentDate();
QTime endOfDay(23, 59, 59);
ui->dteEndTime->setDateTime(QDateTime(today, endOfDay));
}
RecordQuery::~RecordQuery()
@@ -116,7 +121,13 @@ void RecordQuery::UpdateRecordList(const std::vector<DbRecord>& records){
ui->tblRecordList->setItem(rowIndex, column_index, item);
column_index = column_index + 1;
// 方向
item = new QTableWidgetItem(r.direction==int(CommDirection::Receive)?"接收":"发送");
QString s;
if(r.type == int(CommType::Call)){
s = (r.direction==int(CommDirection::Receive)?"来电":"去电");
}else{
s = (r.direction==int(CommDirection::Receive)?"接收":"发送");
}
item = new QTableWidgetItem(s);
item->setTextAlignment(Qt::AlignCenter);
ui->tblRecordList->setItem(rowIndex, column_index, item);
column_index = column_index + 1;

View File

@@ -82,7 +82,14 @@ MainWindow::MainWindow(QWidget *parent)
// // 获取 QComboBox 的 lineEdit 并设置校验器
// ui->cmbCallNumber->lineEdit()->setValidator(validator);
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_talkingTimer->stop();
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimerTimeout1s()));
@@ -180,6 +187,21 @@ void MainWindow::onTimerTimeout1s(){
}
m_tiantongNetworkAccessStatusGrayIcon = !m_tiantongNetworkAccessStatusGrayIcon;
}
// 呼叫状态
CallStatus callStatus;
if(m_uhfCallStatus != CallStatus::kIdle){
callStatus = m_uhfCallStatus;
}else{
callStatus = m_tiantongCallStatus;
}
if(callStatus != CallStatus::kIdle && callStatus != CallStatus::kOnLine){
if(m_callStatusLabelBlack){
ui->lblCallStatus->setStyleSheet("color: green;");
}else{
ui->lblCallStatus->setStyleSheet("color: blue;");
}
m_callStatusLabelBlack = !m_callStatusLabelBlack;
}
}
void MainWindow::keyPressEvent(QKeyEvent* event){
@@ -190,29 +212,31 @@ void MainWindow::keyPressEvent(QKeyEvent* event){
}
}
void MainWindow::StartupTalkingTimer(){
if(m_talkingTimer){
if(m_talkingTimer->isActive()){
return;
}
m_callDuration = 0;
m_talkingTimer->start(1000);
}else{
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);
void MainWindow::StartupTalking(){
if(m_talkingTimer->isActive()){
return;
}
m_currentTalkingBeginTime = QDateTime::currentDateTime();
m_callDuration = 0;
m_talkingTimer->start(1000);
}
void MainWindow::ShutdownTalkingTimer(){
if(m_talkingTimer){
m_talkingTimer->stop();
void MainWindow::ShutdownTalking(){
if(!m_talkingTimer->isActive()){
return;
}
Record r;
r.beginTime = m_currentTalkingBeginTime;
r.channel = m_currentTalkingChan;
r.type = CommType::Call;
r.direction = m_currentTalkingDirection;
r.number = QString::fromStdString(m_currentTalkingNumber);
r.content = "";
r.isUnread = true;
r.callDuration = m_callDuration;
m_recordQueryWidget->InsertRecord(r);
m_talkingTimer->stop();
}
void MainWindow::readPendingDatagrams(){
@@ -226,10 +250,8 @@ void MainWindow::readPendingDatagrams(){
// 读取数据报
m_udpServerSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
//TODO:处理数据包
//m_logger->info("接收到udp消息, 长度 = {}, 数据 = {}",datagram.size(),datagram.toStdString());
m_logger->info("Received a udp message, len = {}, data = {}",datagram.size(),datagram.toStdString());
m_logger->info("Received a udp message, len = {}, data = {}",datagram.size(),datagram.toHex(' ').toStdString());
processCommand(datagram);
}
@@ -286,13 +308,6 @@ void MainWindow::test() {
m_recordQueryWidget->InsertRecords(m_msgList);
//通话中
// ui->cmbCallNumber->setEnabled(false);
// ui->btnCallAnswer->hide();
// ui->btnCallReject->show();
// ui->lblCallStatus->setText("通话中...");
// ui->lblCallDuration->show();
// StartupTalkingTimer();
}
void MainWindow::test1(){
@@ -599,7 +614,6 @@ bool MainWindow::checkNumber(const QString& number){
return false;
}
// TODO: 检查电话号码格式是否满足要求
return true;
}
bool MainWindow::checkMessage(const QString& message){
@@ -616,7 +630,6 @@ bool MainWindow::checkMessage(const QString& 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);
@@ -649,6 +662,7 @@ void MainWindow::on_btnCallAnswer_clicked() {
// 呼叫
if(ui->rdbChannelUHF->isChecked()){
sendUdpMessage(pack_uhf_dial_cmd(number.toStdString()));
m_currentTalkingDirection = CommDirection::Send;
}else if(ui->rdbChannelS->isChecked()){
sendUdpMessage(pack_tiantong_dial_cmd(number.toStdString()));
}else if(ui->rdbChannelAuto->isChecked()){
@@ -746,6 +760,7 @@ void MainWindow::on_btnRecordQuery_clicked() {
//--------------------------------------------------------------------------------------
bool MainWindow::sendUdpMessage(const QByteArray &udpMessage) {
const QHostAddress address(m_udpIp);
m_logger->info("send a udp message, len = {}, data = {}",udpMessage.size(),udpMessage.toHex(' ').toStdString());
if (m_udpSocket->writeDatagram(udpMessage, address, m_peerPort) !=
udpMessage.size()) {
//m_logger->error("发送udp消息错误");
@@ -990,36 +1005,37 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
//位置
int32_t longitude_v = qFromLittleEndian<qint32>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
data_index += 4;
float longitude = longitude_v * 0.000001;
float longitude = longitude_v / 1e6;
int32_t latitude_v = qFromLittleEndian<qint32>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
data_index += 4;
float latitude = latitude_v * 0.000001;
float latitude = latitude_v / 1e6;
int32_t altitude_v = qFromLittleEndian<qint32>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
data_index += 4;
float altitude = altitude_v * 0.1;
float altitude = altitude_v / 10.0;
//液压缸升降高度状态
int16_t oil_level_position_v = qFromLittleEndian<qint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
data_index += 2;
float oil_level_position = oil_level_position_v * 0.01;//米
float oil_level_position = oil_level_position_v /1000.0;//米
//自检状态
//天线电源A电压
int16_t antenna_power_supply_a_voltage_v = qFromLittleEndian<qint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
data_index += 2;
float antenna_power_supply_a_voltage = antenna_power_supply_a_voltage_v * 0.001;//V
float antenna_power_supply_a_voltage = antenna_power_supply_a_voltage_v / 1000.0;//V
//天线电源A电流
int16_t antenna_power_supply_a_current_v = qFromLittleEndian<qint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
data_index += 2;
float antenna_power_supply_a_current = antenna_power_supply_a_current_v * 0.001;//A
float antenna_power_supply_a_current = antenna_power_supply_a_current_v / 1000.0;//A
//天线电源B电压
int16_t antenna_power_supply_b_voltage_v = qFromLittleEndian<qint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
data_index += 2;
float antenna_power_supply_b_voltage = antenna_power_supply_b_voltage_v * 0.001;//V
float antenna_power_supply_b_voltage = antenna_power_supply_b_voltage_v / 1000.0;//V
//天线电源B电流
int16_t antenna_power_supply_b_current_v = qFromLittleEndian<qint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
data_index += 2;
float antenna_power_supply_b_current = antenna_power_supply_b_current_v * 0.001;//A
float antenna_power_supply_b_current = antenna_power_supply_b_current_v / 1000.0;//A
//天线温度
int16_t antenna_temperature = qFromLittleEndian<qint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
int16_t antenna_temperature_v = qFromLittleEndian<qint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));
float antenna_temperature = antenna_temperature_v/100.0;
data_index += 2;
//UHF发送锁相环频综状态
uint8_t phase_locked_loop_send = cmd[data_index++];
@@ -1041,7 +1057,7 @@ void MainWindow::processStatusReportCmd(const QByteArray& cmd){
processUhfMCardStatus(uhf_m_card_status);
processTianTongMCardStatus(tiantong_m_card_status);
//处理呼叫状态
processCallStatus(tiantong_call_status,uhf_call_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;
@@ -1088,7 +1104,11 @@ void MainWindow::processSearchSatelliteStatusReport(const QByteArray& cmd){
}
int data_index = COMMAND_DATA_BEGIN_INDEX;
uint8_t number_of_satellite = cmd[data_index++];//卫星数量
//TODO: 做长度检查
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());
}
std::vector<SatelliteStatus> all_satellite_status;
for(int i = 0 ; i < number_of_satellite; ++i){
@@ -1370,7 +1390,7 @@ void MainWindow::processTianTongNetworkAccessStatus(uint8_t status){
}
}
// 处理呼叫状态
void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call_status){
void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call_status,const std::string& tiantong_number,const std::string& uhf_number){
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)){
@@ -1381,15 +1401,17 @@ void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call
&& uhf_call_status != uint8_t(CallStatus::kCallIsComing)){
return;
}
CallStatus m_tiantongCallStatus = CallStatus(tiantong_call_status);
CallStatus m_uhfCallStaus = CallStatus(uhf_call_status);
m_tiantongCallStatus = CallStatus(tiantong_call_status);
m_uhfCallStatus = CallStatus(uhf_call_status);
//TODO: 会不会有冲突的情况?
CallStatus status;
Channel chan;
if(m_tiantongCallStatus != CallStatus::kIdle){
status = m_tiantongCallStatus;
chan = Channel::S;
}else{
status = m_uhfCallStaus;
status = m_uhfCallStatus;
chan = Channel::Uhf;
}
switch(status){
case CallStatus::kIdle://空闲
@@ -1398,8 +1420,10 @@ void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call
ui->btnCallAnswer->show();
ui->btnCallReject->hide();
ui->lblCallStatus->setText("空闲中...");
ui->lblCallStatus->setStyleSheet("color: black;");
m_callStatusLabelBlack = true;
ui->lblCallDuration->hide();
ShutdownTalkingTimer();
ShutdownTalking();
break;
case CallStatus::kDialing://拨号中
//拨号中
@@ -1419,16 +1443,37 @@ void MainWindow::processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call
break;
case CallStatus::kOnLine://通话中
//通话中
if(chan == Channel::S){
m_currentTalkingNumber = tiantong_number;
ui->cmbCallNumber->setCurrentText(QString::fromStdString(tiantong_number));
}else{
m_currentTalkingNumber = uhf_number;
ui->cmbCallNumber->setCurrentText(QString::fromStdString(uhf_number));
}
m_currentTalkingChan = chan;
ui->cmbCallNumber->setEnabled(false);
ui->btnCallAnswer->hide();
ui->btnCallReject->show();
ui->lblCallStatus->setText("通话中...");
ui->lblCallStatus->setStyleSheet("color: green;");
m_callStatusLabelBlack = false;
ui->lblCallDuration->show();
StartupTalkingTimer();
StartupTalking();
break;
case CallStatus::kCallIsComing://来电中
//有来电
ui->cmbCallNumber->setEnabled(false);
if(chan == Channel::S){
m_currentTalkingNumber = tiantong_number;
ui->cmbCallNumber->setCurrentText(QString::fromStdString(tiantong_number));
}else{
m_currentTalkingNumber = uhf_number;
ui->cmbCallNumber->setCurrentText(QString::fromStdString(uhf_number));
}
m_currentTalkingDirection = CommDirection::Receive;
ui->btnCallAnswer->show();
ui->btnCallReject->show();
ui->lblCallStatus->setText("来电中...");

View File

@@ -94,10 +94,10 @@ private:
// 处理网络访问状态
void processUhfNetworkAccessStatus(uint8_t status);
void processTianTongNetworkAccessStatus(uint8_t status);
void processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call_status);
void processCallStatus(uint8_t tiantong_call_status,uint8_t uhf_call_status,const std::string& tiantong_number,const std::string& uhf_number);
void StartupTalkingTimer();
void ShutdownTalkingTimer();
void StartupTalking();
void ShutdownTalking();
void test();
std::pair<QString,QString> parseReceivedShortMessage(const QByteArray& cmd,Channel chan);
@@ -146,6 +146,12 @@ private:
std::vector<Record> m_msgList;
int m_unReadMsgCount = 0;
int m_callDuration = 0;
std::string m_currentTalkingNumber;
QDateTime m_currentTalkingBeginTime;
Channel m_currentTalkingChan;
CommDirection m_currentTalkingDirection;
bool m_callStatusLabelBlack = true;
QString m_udpIp{"127.0.0.1"};
uint16_t m_localPort{8000};