Files
gcs-nf/App/ToolsUI/Payload/Payload.cpp
T
2026-06-09 23:00:59 +08:00

1543 lines
45 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "Payload.h"
#include "ui_Payload.h"
Payload::Payload(QWidget *parent) :
QWidget(parent),
ui(new Ui::Payload)
{
ui->setupUi(this);
m_parent = parent;
QFile file(":/qss/Payload.qss");
file.open(QFile::ReadOnly);
QTextStream filetext(&file);
QString stylesheet = filetext.readAll();
this->setStyleSheet(stylesheet);
file.close();
this->setWindowTitle(tr("Payload"));
Config *cfg = new Config();
QHostAddress m_ra_address;
QHostAddress m_uv_address;
QVariant m_ra_out_port;
QVariant m_uv_out_port;
QVariant m_ra_in_port;
QVariant m_uv_in_port;
cfg->get_Payload_RA_Info(&m_ra_address,&m_ra_out_port,&m_ra_in_port);
cfg->get_Payload_UV_Info(&m_uv_address,&m_uv_out_port,&m_uv_in_port);
ra_address = m_ra_address;
uv_address = m_uv_address;
ra_out_port = m_ra_out_port.toInt();
uv_out_port = m_uv_out_port.toInt();
ra_in_port = m_ra_in_port.toInt();
uv_in_port = m_uv_in_port.toInt();
delete cfg;
qint32 width = 300;
qint32 height = 35;
//============set size============
setHeight(ui->lineEdit_CommandName,height);
setHeight(ui->pushButton_SendCommand,height);
setHeight(ui->pushButton_Cancel,height);
setHeight(ui->pushButton_500W_Open,height);
setHeight(ui->pushButton_500W_Close,height);
setHeight(ui->pushButton_radar_open,height);
setHeight(ui->pushButton_radar_close,height);
setHeight(ui->pushButton_radar_uploadthreat,height);
setHeight(ui->pushButton_radar_uploadwarning,height);
setHeight(ui->pushButton_radar_cancel_uploadwarning,height);
setHeight(ui->pushButton_radar_open_maneuver,height);
setHeight(ui->pushButton_radar_close_maneuver,height);
setHeight(ui->comboBox_radar_threat_level,height);
setHeight(ui->label_radar_status,height);
setHeight(ui->pushButton_radar_control_start,height);
setHeight(ui->pushButton_radar_control_stop,height);
setHeight(ui->spinBox_RA_ID,height);
setHeight(ui->pushButton_radar_fore_maneuver,height);
setHeight(ui->pushButton_radar_exit_fore_maneuver,height);
setHeight(ui->pushButton_uv_power_on,height);
setHeight(ui->pushButton_uv_power_off,height);
setHeight(ui->pushButton_uv_open,height);
setHeight(ui->pushButton_uv_close,height);
//setHeight(ui->pushButton_uv_uploadthreat,height);
setHeight(ui->pushButton_uv_uploadwarning,height);
setHeight(ui->pushButton_uv_cancel_uploadwarning,height);
setHeight(ui->pushButton_uv_open_maneuver,height);
setHeight(ui->pushButton_uv_close_maneuver,height);
setHeight(ui->label_uv_status,height);
setHeight(ui->pushButton_flare_self_check,height);
setHeight(ui->pushButton_flare_circuit_on,height);
setHeight(ui->pushButton_flare_circuit_off,height);
setHeight(ui->pushButton_flare_release_time_set,height);
setHeight(ui->pushButton_flare_on,height);
setHeight(ui->pushButton_flare_off,height);
setHeight(ui->pushButton_flare_manrelease,height);
setHeight(ui->pushButton_flare_manrelease_set,height);
setHeight(ui->pushButton_uv_fore_maneuver,height);
setHeight(ui->pushButton_uv_exit_fore_maneuver,height);
setHeight(ui->pushButton_flare_release_bom1,height);
setHeight(ui->pushButton_flare_release_bom2,height);
setHeight(ui->pushButton_flare_release_bom3,height);
setHeight(ui->pushButton_flare_release_bom4,height);
setHeight(ui->pushButton_flare_release_bom5,height);
setHeight(ui->pushButton_flare_release_bom6,height);
setWidth(ui->pushButton_flare_release_time_set,150);
setWidth(ui->pushButton_flare_release_bom1,150);
setWidth(ui->pushButton_flare_release_bom2,150);
setWidth(ui->pushButton_flare_release_bom3,150);
setWidth(ui->pushButton_flare_release_bom4,150);
setWidth(ui->pushButton_flare_release_bom5,150);
setWidth(ui->pushButton_flare_release_bom6,150);
setHeight(ui->lineEdit_radar_ip,height);
setHeight(ui->lineEdit_radar_port,height);
setHeight(ui->lineEdit_radar_port_in,height);
setHeight(ui->lineEdit_uv_ip,height);
setHeight(ui->lineEdit_uv_port,height);
setHeight(ui->lineEdit_uv_port_in,height);
//setHeight(ui->lineEdit_uv_set_extent,height);
//setHeight(ui->lineEdit_uv_set_level,height);
setHeight(ui->lineEdit_flare_manrelease_time,height);
setHeight(ui->lineEdit_flare_release_time,height);
QFont font;
font.setPointSize(18);
font.setFamily("SimHei");
QWidget::setFont(font);
setFont(ui->lineEdit_radar_ip,font);
setFont(ui->lineEdit_radar_port,font);
setFont(ui->lineEdit_radar_port_in,font);
setFont(ui->spinBox_RA_ID,font);
setFont(ui->comboBox_radar_threat_level,font);
setFont(ui->lineEdit_uv_ip,font);
setFont(ui->lineEdit_uv_port,font);
setFont(ui->lineEdit_uv_port_in,font);
//setFont(ui->lineEdit_uv_set_extent,font);
//setFont(ui->lineEdit_uv_set_level,font);
setFont(ui->lineEdit_flare_manrelease_time,font);
setFont(ui->lineEdit_flare_release_time,font);
//============set color===========
setColor(ui->label_radar_status,state::inital);
setColor(ui->pushButton_radar_open,green_state);
setColor(ui->pushButton_radar_close,green_state);
setColor(ui->pushButton_radar_uploadthreat,green_state);
setColor(ui->pushButton_radar_uploadwarning,green_state);
setColor(ui->pushButton_radar_cancel_uploadwarning,green_state);
setColor(ui->pushButton_radar_open_maneuver,green_state);
setColor(ui->pushButton_radar_close_maneuver,red_state);
//setHeight(ui->pushButton_radar_fore_maneuver,height);
//setHeight(ui->pushButton_radar_exit_fore_maneuver,height);
setColor(ui->label_uv_status,state::inital);
setColor(ui->pushButton_uv_power_on,green_state);
setColor(ui->pushButton_uv_power_off,red_state);
setColor(ui->pushButton_uv_open,green_state);
setColor(ui->pushButton_uv_close,green_state);
//setColor(ui->pushButton_uv_uploadthreat,green_state);
setColor(ui->pushButton_uv_uploadwarning,green_state);
setColor(ui->pushButton_uv_cancel_uploadwarning,green_state);
setColor(ui->pushButton_uv_open_maneuver,green_state);
setColor(ui->pushButton_uv_close_maneuver,red_state);
setColor(ui->label_flare_bom1,state::inital);
setColor(ui->label_flare_bom2,state::inital);
setColor(ui->label_flare_bom3,state::inital);
setColor(ui->label_flare_bom4,state::inital);
setColor(ui->label_flare_bom5,state::inital);
setColor(ui->label_flare_bom6,state::inital);
setColor(ui->label_flare_ch1,state::inital);
setColor(ui->label_flare_ch2,state::inital);
setColor(ui->label_flare_ch3,state::inital);
setColor(ui->label_flare_ch4,state::inital);
setColor(ui->label_flare_ch5,state::inital);
setColor(ui->label_flare_ch6,state::inital);
setColor(ui->label_flare_dev_id,state::inital);
setColor(ui->label_flare_fire_switch,state::inital);
setColor(ui->label_flare_power,state::inital);
setColor(ui->label_flare_release_switch,state::inital);
setColor(ui->label_flare_self_check_status,state::inital);
setColor(ui->label_flare_status,state::inital);
setColor(ui->pushButton_flare_self_check,green_state);
setColor(ui->pushButton_flare_circuit_on,green_state);
setColor(ui->pushButton_flare_circuit_off,red_state);
setColor(ui->pushButton_flare_release_time_set,green_state);
setColor(ui->pushButton_flare_on,green_state);
setColor(ui->pushButton_flare_off,red_state);
setColor(ui->pushButton_flare_manrelease,green_state);
setColor(ui->pushButton_flare_manrelease_set,green_state);
//===========set line edit===================
QRegularExpressionValidator *validator = new QRegularExpressionValidator(QRegularExpression("^\\d+$"), this);
//ui->lineEdit_uv_set_extent->setValidator(validator);
//ui->lineEdit_uv_set_level->setValidator(validator);
ui->lineEdit_flare_manrelease_time->setValidator(validator);
ui->lineEdit_flare_release_time->setValidator(validator);
QRegularExpression ipRegex("^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
ui->lineEdit_radar_ip->setValidator(new QRegularExpressionValidator(ipRegex, this));
ui->lineEdit_uv_ip->setValidator(new QRegularExpressionValidator(ipRegex, this));
// 0-65536 的正则表达式(精确匹配)
QIntValidator *port_validator = new QIntValidator(0, 65535, this);
ui->lineEdit_radar_port->setValidator(port_validator);
ui->lineEdit_radar_port_in->setValidator(port_validator);
ui->lineEdit_uv_port->setValidator(port_validator);
ui->lineEdit_uv_port_in->setValidator(port_validator);
QRegularExpressionValidator *uv_validator = new QRegularExpressionValidator(
QRegularExpression("^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"), this);
//ui->lineEdit_uv_set_extent->setValidator(uv_validator);
//ui->lineEdit_uv_set_level->setValidator(uv_validator);
ui->comboBox_radar_threat_level->addItem(QString("等级 0"),0);
ui->comboBox_radar_threat_level->addItem(QString("等级 1"),1);
ui->comboBox_radar_threat_level->addItem(QString("等级 2"),2);
ui->comboBox_radar_threat_level->addItem(QString("等级 3"),3);
ui->comboBox_radar_threat_level->addItem(QString("等级 4"),4);
ui->comboBox_radar_threat_level->addItem(QString("等级 5"),5);
ui->comboBox_radar_threat_level->setCurrentIndex(5);
ui->lineEdit_radar_ip->setText(QHostAddress(ra_address).toString());
ui->lineEdit_radar_port->setText(QString::number(ra_out_port));
ui->lineEdit_radar_port_in->setText(QString::number(ra_in_port));
ui->lineEdit_radar_ip->setPlaceholderText(QString("格式为 192.168.1.100"));
ui->lineEdit_radar_port->setPlaceholderText(QString("对方接收端口"));
ui->lineEdit_radar_port_in->setPlaceholderText(QString("本机监听端口"));
ui->lineEdit_uv_ip->setText(QHostAddress(uv_address).toString());
ui->lineEdit_uv_port->setText(QString::number(uv_out_port));
ui->lineEdit_uv_port_in->setText(QString::number(uv_in_port));
ui->lineEdit_uv_ip->setPlaceholderText(QString("格式为 192.168.1.100"));
ui->lineEdit_uv_port->setPlaceholderText(QString("对方接收端口"));
ui->lineEdit_uv_port_in->setPlaceholderText(QString("本机监听端口"));
//ui->lineEdit_uv_set_extent->setText(QString::number(32));
//ui->lineEdit_uv_set_level->setText(QString::number(140));
ui->lineEdit_flare_release_time->setText(QString::number(1000));
ui->lineEdit_flare_manrelease_time->setText(QString::number(1000));
setup_commands();
setup_actions();
}
Payload::~Payload()
{
delete ui;
}
void Payload::setColor(QWidget *w,QColor s)
{
QString stype = "background-color: ";
stype.append(s.name());
stype.append(";");
if(w)
{
w->setStyleSheet(stype);
w->style()->unpolish(w);
w->style()->polish(w);
}
}
void Payload::setColor(QWidget *w,state s)
{
w->setProperty("state",s);
w->style()->unpolish(w);
w->style()->polish(w);
}
void Payload::setValue(QLabel *w,QString s)
{
w->setText(s);
}
void Payload::setHeight(QWidget *w,qint32 height)
{
w->setFixedHeight(height);
}
void Payload::setWidth(QWidget *w,qint32 width)
{
w->setFixedWidth(width);
}
void Payload::setSize(QWidget *w,qint32 width,qint32 height)
{
w->setFixedSize(width,height);
}
void Payload::setFont(QWidget *w,QFont font)
{
w->setFont(font);
}
void Payload::updateUI()
{
}
void Payload::resizeEvent(QResizeEvent *event)
{
//attChart->resizeEvent(event);
}
void Payload::closeEvent(QCloseEvent *event)
{
setFloat();
event->ignore();
}
void Payload::setFloat(void)
{
if(this->parent())
{
this->setParent(nullptr);
QScreen *screen=QGuiApplication::primaryScreen ();
this->move((screen->availableGeometry().width()-this->width())/2,(screen->availableGeometry().height()-this->height())/2);
this->show();
this->resize(m_parent->size());
updateUI();
}
else
{
this->setParent(m_parent);
this->move(0,0);
this->show();
this->resize(m_parent->size());
updateUI();
}
}
void Payload::EnCapData(uint16_t seq,QByteArray data)
{
//rwrid为8
//uvwdid为9
switch (seq) {
case 0x08://rwr
{
uint8_t msg[50];
uint8_t len = 30;
for(int i = 0;i<len;i++)
{
msg[i] = data[i];
}
if((RA_Sock)&&(RA_Sock->isOpen()))
{
//qDebug() << "rwr send" << data;
RA_Sock->writeDatagram((const char *)msg,len,ra_address, ra_out_port);
}
}break;
case 0x09://uvwd
{
//qDebug() << " uvwd send" << data;
uint8_t msg[50];
uint8_t len = 30;
for(int i = 0;i<len;i++)
{
msg[i] = data[i];
}
if((UV_Sock)&&UV_Sock->isOpen())
{
//qDebug() << "send" << data;
UV_Sock->writeDatagram((const char *)msg,len,uv_address, uv_out_port);
}
}break;
default:
break;
}
}
void Payload::setUVWDState(mavlink_uvwdstate_t uvwdstate)
{
//通过IP发送出去
/*
if((UV_Sock)&&UV_Sock->isOpen())
{
uint8_t msg[50];
uint8_t len = 0;
//0~2
msg[len++] = 0xDD;
msg[len++] = 0x77;
msg[len++] = uvwdstate.device_id;
//3
msg[len++] = uvwdstate.alarm_flag;
//4~6
msg[len++] = uvwdstate.integration_time[0];
msg[len++] = uvwdstate.integration_time[1];
msg[len++] = uvwdstate.integration_time[2];
//7~8
msg[len++] = uvwdstate.image_avg_brightness;
msg[len++] = uvwdstate.image_avg_brightness >> 8;
//9~11
msg[len++] = uvwdstate.device_state_1;
msg[len++] = uvwdstate.device_state_2;
msg[len++] = uvwdstate.device_state_3;
//12~28
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
//SUN
uint8_t sum = 0;
for(int i = 0; i<29;i++)
{
sum += msg[i];
}
msg[len++] = sum;
UV_Sock->writeDatagram((const char *)msg,len,uv_address, uv_out_port);
}
*/
}
void Payload::setRWRState(mavlink_rwrstate_t rwrstate)
{/*
if((RA_Sock)&&(RA_Sock->isOpen()))
{
uint8_t msg[50];
uint8_t len = 0;
//0~3
msg[len++] = 0x90;
msg[len++] = 0xEB;
msg[len++] = rwrstate.device_id;
msg[len++] = rwrstate.msg_type;
//4~14
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
//15
msg[len++] = rwrstate.threat_level;
//16-28
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
msg[len++] = 0;
//SUN
uint8_t sum = 0;
for(int i = 2; i<29;i++)
{
sum += msg[i];
}
msg[len++] = sum;
RA_Sock->writeDatagram((const char *)msg,len,ra_address, ra_out_port);
}
*/
}
void Payload::setDLSState(mavlink_dlsstate_t dlsstate)
{
//================设备ID==============
ui->label_flare_dev_id->setText(QString::number(dlsstate.device_id));
//=================自检状态=============
uint8_t seft_check = dlsstate.self_test_state;
if(seft_check == 0x00)
{
ui->label_flare_self_check_status->setText(QString("上电未自检"));
}
else if(seft_check == 0x01)
{
ui->label_flare_self_check_status->setText(QString("自检正常"));
}
else if(seft_check == 0x02)
{
ui->label_flare_self_check_status->setText(QString("自检异常"));
}
//====================================
uint8_t fire_switch = dlsstate.power_pyro_safety_state & 0x03;
if(fire_switch == 0x00)
{
ui->label_flare_fire_switch->setText(QString("火工关"));
}
else if(fire_switch == 0x01)
{
ui->label_flare_fire_switch->setText(QString("火工异常"));
}
else if(fire_switch == 0x03)
{
ui->label_flare_fire_switch->setText(QString("火工开"));
}
//====================================
uint8_t power_voltage = (dlsstate.power_pyro_safety_state & 0x0C) >> 2;
if(power_voltage == 0x00)
{
ui->label_flare_power->setText(QString("电压正常"));
}
else if(power_voltage == 0x01)
{
ui->label_flare_power->setText(QString("电压异常"));
}
//====================================
uint8_t release_switch = (dlsstate.power_pyro_safety_state & 0x10) >> 4;
if(release_switch == 0x00)
{
ui->label_flare_release_switch->setText(QString(""));
}
else if(release_switch == 0x01)
{
ui->label_flare_release_switch->setText(QString(""));
}
//====================================
uint8_t work_state = dlsstate.work_state;
if(work_state == 0x00)
{
ui->label_flare_status->setText(QString("待机"));
}
else if(work_state == 0x40)
{
ui->label_flare_status->setText(QString("自检测试"));
}
else if(work_state == 0xff)
{
ui->label_flare_status->setText(QString("手动触发"));
}
else if((work_state >= 0x01) && (work_state <= 0x0F))
{
ui->label_flare_status->setText(QString("执行任务 %1").arg(work_state));
}
//====================================
//弹正常显示绿色,异常显示红色
uint8_t cartridge1 = dlsstate.cartridge_state[2];
setColor(ui->label_flare_bom1,(cartridge1 & 0x01)?(state::failure):(state::success));
setColor(ui->label_flare_bom2,(cartridge1 & 0x02)?(state::failure):(state::success));
setColor(ui->label_flare_bom3,(cartridge1 & 0x04)?(state::failure):(state::success));
setColor(ui->label_flare_bom4,(cartridge1 & 0x08)?(state::failure):(state::success));
setColor(ui->label_flare_bom5,(cartridge1 & 0x10)?(state::failure):(state::success));
setColor(ui->label_flare_bom6,(cartridge1 & 0x20)?(state::failure):(state::success));
//====================================
//有弹显示绿色,无弹显示红色
uint8_t channel1 = dlsstate.channel_cartridge_state[2];
setColor(ui->label_flare_ch1,(channel1 & 0x01)?(state::success):(state::failure));
setColor(ui->label_flare_ch2,(channel1 & 0x02)?(state::success):(state::failure));
setColor(ui->label_flare_ch3,(channel1 & 0x04)?(state::success):(state::failure));
setColor(ui->label_flare_ch4,(channel1 & 0x08)?(state::success):(state::failure));
setColor(ui->label_flare_ch5,(channel1 & 0x10)?(state::success):(state::failure));
setColor(ui->label_flare_ch6,(channel1 & 0x20)?(state::success):(state::failure));
}
void Payload::setPayloadStatus(mavlink_payloadalarmstate_t payloadalarmstate)
{
if(payloadalarmstate.rwr_alarm_flag)
{
Radar_Status(1);
}
else
{
Radar_Status(0);
}
if(payloadalarmstate.uvwd_alarm_flag)
{
UV_Status(1);
}
else
{
UV_Status(0);
}
}
void Payload::on_pushButton_Cancel_clicked()
{
ui->lineEdit_CommandName->clear();
m_name.clear();
m_param1 = 0;
m_param2 = 0;
m_param3 = 0;
m_param4 = 0;
m_param5 = 0;
m_param6 = 0;
m_param7 = 0;
m_command = 0;
m_confirm = 0;
}
void Payload::on_commandClicked(QString name,
float param1,float param2,float param3,float param4,
float param5,float param6,float param7,
uint16_t command,uint8_t confirmation)
{
m_name = name;
m_param1 = param1;
m_param2 = param2;
m_param3 = param3;
m_param4 = param4;
m_param5 = param5;
m_param6 = param6;
m_param7 = param7;
m_command = command;
m_confirm = confirmation;
ui->lineEdit_CommandName->setText(name);
cmdType = 0;
}
void Payload::on_pushButton_SendCommand_clicked()
{
if(cmdType == 0)
{
if(m_command == 0)
{
emit showMessage(tr("please set command first ,command :%1").arg(m_command));
return;
}
}
if(cmdType == 0)
{
emit showMessage(tr("发送指令 ") + QString::number(m_command) + " " + m_name,5000);
emit cmd_long(m_param1,m_param2,m_param3,m_param4,m_param5,m_param6,m_param7,m_command,m_confirm);
}
else if(cmdType == 1)
{
//emit showMessage(tr("修改参数 ") + " " + m_id.toLatin1().data() + " " + QString::number(m_value),5000);
//emit WriteCmd(m_sysid,m_compid,m_id.toLatin1().data(),m_type,param_getvalue(m_value,m_type));
}
}
void Payload::RA_Parser_init(void)
{
RA_Parser_State = 0;
RA_Index = 0;
RA_SUM = 0;
}
qint8 Payload::RA_ParseByte(uint8_t byte)
{
qint8 index = -1;
switch (RA_Parser_State) {
case 0:
if (byte == 0x90) {
RA_Index = 0;
RA_Frame[RA_Index] = byte;
RA_Parser_State = 1;
}
break;
case 1:
if (byte == 0xEB) {
RA_Index ++;
RA_Frame[RA_Index] = byte;
RA_SUM = 0;
RA_Parser_State = 2;
} else {
// 帧头2错误,重置并重新处理当前字节(作为新的帧头1)
RA_Parser_State = 0;
}
break;
case 2:
if (RA_Index < 11) {
RA_Index ++;
RA_Frame[RA_Index] = byte;
RA_SUM += byte;
if(RA_Index == 11)
{
RA_Parser_State = 3;
}
}
break;
case 3:
if(RA_SUM == byte)//解析成功,发送数据
{
RA_Index++;
RA_Frame[RA_Index] = byte;
index = RA_Frame[2];
}
RA_Parser_State = 0;
break;
}
return index;
}
void Payload::UV_Parser_init(void)
{
UV_Parser_State = 0;
UV_Index = 0;
UV_SUM = 0;
}
qint8 Payload::UV_ParseByte(uint8_t byte)
{
qint8 index = -1;
switch (UV_Parser_State) {
case 0:
if (byte == 0xDD) {
UV_SUM = 0;
UV_Index = 0;
UV_Frame[UV_Index] = byte;
UV_SUM = byte;
UV_Parser_State = 1;
}
break;
case 1:
if (byte == 0x77) {
UV_Index ++;
UV_Frame[UV_Index] = byte;
UV_SUM += byte;
UV_Parser_State = 2;
} else {
// 帧头2错误,重置并重新处理当前字节(作为新的帧头1)
UV_Parser_State = 0;
}
break;
case 2:
if (UV_Index < 11) {
UV_Index ++;
UV_Frame[UV_Index] = byte;
UV_SUM += byte;
if(UV_Index == 11)
{
UV_Parser_State = 3;
}
}
break;
case 3:
if(UV_SUM == byte)//解析成功,发送数据
{
UV_Index++;
UV_Frame[UV_Index] = byte;
index = UV_Frame[2];
}
UV_Parser_State = 0;
break;
}
return index;
}
void Payload::setup_commands(void)
{
//set network
//========power===========================
connect(ui->pushButton_500W_Open,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("电池500W输出开"),102,1,0,0,0,0,0,180,0);
});
connect(ui->pushButton_500W_Close,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("电池500W输出关"),102,0,0,0,0,0,0,180,0);
});
//========radar=============================
connect(ui->pushButton_radar_open,&QPushButton::clicked,this,[=](){
if(ui->lineEdit_radar_ip->text().isEmpty() || ui->lineEdit_radar_port->text().isEmpty() || ui->lineEdit_radar_port_in->text().isEmpty())
{
showMessage("请设置正确的IP号和端口号",5000);
return;
}
//输出开启
QString ip = ui->lineEdit_radar_ip->text();
quint16 port = ui->lineEdit_radar_port->text().toUInt();
ra_in_port = ui->lineEdit_radar_port_in->text().toUInt();
ra_address.setAddress(ip);
ra_out_port = port;
Config *cfg = new Config();
cfg->set_Payload_RA_Info(ra_address,QVariant(ra_out_port),QVariant(ra_in_port));
delete cfg;
if(!RA_Sock)
{
RA_Sock = new QUdpSocket(this);
bool rst = RA_Sock->bind(QHostAddress::AnyIPv4,ra_in_port);
qDebug() << rst;
if(rst)
{
if(RA_Sock->open(QIODevice::ReadWrite))
{
qDebug() << "信息输出端口打开正常";
showMessage("雷达信息输出端口打开正常",5000);
}
connect(RA_Sock,&QUdpSocket::readyRead,this,[=](){
//收到其他地面站数据
/*
帧头 1 帧头 2 设备识别码 数据 和校验
0xDD 0x77 0x02 控制数据 前12个字节累加和
lbyte lbyte lbyte 9byte 1byte
*/
//发送180 113 4 设备号 报文类型 工作状态
//发送180 113 5 设备号 报文类型 工作状态
QObject *obj = sender();
if(obj)
{
QUdpSocket *clientsock = qobject_cast<QUdpSocket *>(obj);
if(clientsock)
{
while (clientsock->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(clientsock->pendingDatagramSize());
clientsock->readDatagram(datagram.data(), datagram.size());
//qDebug() << "ra recive" << datagram;
qint8 rst = -1;
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{
rst = RA_ParseByte(*i);
if(rst != -1)
{
/*
//发送180 114 4(5地面站发送) 识别码 命令字节 强度档位 范围档位
uint8_t dev = datagram[2];
uint8_t type = datagram[3] & 0x0F;
uint8_t state = ((datagram[3] & 0xF0) == 0x10)?(0x01):(0x00);
qDebug() << "ra recive" << dev << type << state;
on_commandClicked(QString("雷达告警控制指令"),113,4,dev,type,state,0,0,180,0);
on_pushButton_SendCommand_clicked();
*/
//发到encap
QByteArray rwr_encap;
rwr_encap.clear();
for(int i = 0;i< 13;i++)
{
rwr_encap[i] = RA_Frame[i];
}
//qDebug() << "send ra" << rwr_encap;
emit send_EnCapData(0x08,rwr_encap);
}
}
}
}
}
});
}
else
{
qDebug() << "绑定失败:" << RA_Sock->errorString();
showMessage("绑定失败:" + RA_Sock->errorString(),5000);
}
}
});
connect(ui->pushButton_radar_close,&QPushButton::clicked,this,[=](){
//输出关闭
if(RA_Sock)
{
RA_Sock->abort();
delete RA_Sock;
RA_Sock = nullptr;
showMessage("雷达信息输出端口关闭",5000);
}
});
connect(ui->pushButton_radar_uploadthreat,&QPushButton::clicked,this,[=](){
uint8_t level = ui->comboBox_radar_threat_level->currentData(Qt::UserRole).toInt();
on_commandClicked(QString("上传威胁等级"),113,1,level,0,0,0,0,180,0);
qDebug() << level;
});
connect(ui->pushButton_radar_uploadwarning,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("注入雷达告警信号"),113,2,1,0,0,0,0,180,0);
});
connect(ui->pushButton_radar_cancel_uploadwarning,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("取消注入雷达告警信号"),113,2,0,0,0,0,0,180,0);
});
connect(ui->pushButton_radar_open_maneuver,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("自动逃逸机动开启"),113,3,1,0,0,0,0,180,0);
});
connect(ui->pushButton_radar_close_maneuver,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("自动逃逸机动关闭"),113,3,0,0,0,0,0,180,0);
});
connect(ui->pushButton_radar_control_start,&QPushButton::clicked,this,[=](){
//发送180 114 4(5地面站发送) 识别码 命令字节 强度档位 范围档位
uint8_t dev = ui->spinBox_RA_ID->value();
uint8_t type = 4;
uint8_t state = 1;
on_commandClicked(QString("地面站雷达告警控制指令"),113,5,dev,type,state,0,0,180,0);
});
connect(ui->pushButton_radar_control_stop,&QPushButton::clicked,this,[=](){
//发送180 114 4(5地面站发送) 识别码 命令字节 强度档位 范围档位
uint8_t dev = ui->spinBox_RA_ID->value();
uint8_t type = 4;
uint8_t state = 0;
on_commandClicked(QString("地面站雷达告警控制指令"),113,5,dev,type,state,0,0,180,0);
});
connect(ui->pushButton_radar_fore_maneuver,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("地面站雷达告警控制指令"),112,3,0,0,0,0,0,180,0);
});
connect(ui->pushButton_radar_exit_fore_maneuver,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("地面站雷达告警控制指令"),112,2,0,0,0,0,0,180,0);
});
//==============uv=========================
connect(ui->pushButton_uv_open,&QPushButton::clicked,this,[=](){
if(ui->lineEdit_uv_ip->text().isEmpty() || ui->lineEdit_uv_port->text().isEmpty() || ui->lineEdit_uv_port_in->text().isEmpty())
{
showMessage("请设置正确的IP号和端口号",5000);
return;
}
//输出开启
QString ip = ui->lineEdit_uv_ip->text();
quint16 port = ui->lineEdit_uv_port->text().toUInt();
uv_in_port = ui->lineEdit_uv_port_in->text().toUInt();
uv_address.setAddress(ip);
uv_out_port = port;
Config *cfg = new Config();
cfg->set_Payload_UV_Info(uv_address,QVariant(uv_out_port),QVariant(uv_in_port));
delete cfg;
if(!UV_Sock)
{
UV_Sock = new QUdpSocket(this);
int rst = UV_Sock->bind(QHostAddress::AnyIPv4,uv_in_port);
if(rst)
{
if(UV_Sock->open(QIODevice::ReadWrite))
{
qDebug() << "信息输出端口打开正常";
showMessage("紫外信息输出端口打开正常",5000);
UV_Parser_init();
}
connect(UV_Sock,&QUdpSocket::readyRead,this,[=](){
//收到其他地面站数据
/*
帧头 1 帧头 2 设备识别码 数据 和校验
0xDD 0x77 0x02 控制数据 前12个字节累加和
lbyte lbyte lbyte 9byte 1byte
*/
QObject *obj = sender();
if(obj)
{
QUdpSocket *clientsock = qobject_cast<QUdpSocket *>(obj);
if(clientsock)
{
while (clientsock->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(clientsock->pendingDatagramSize());
clientsock->readDatagram(datagram.data(), datagram.size());
//qDebug() << "uv recive" << datagram;
qint8 rst = -1;
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{
rst = UV_ParseByte(*i);
if(rst != -1)
{
/*
//发送180 114 5 识别码 命令字节 强度档位 范围档位
uint8_t id = datagram[2];
uint8_t cmd = datagram[3];
uint8_t extent = datagram[4];
uint8_t level = datagram[5];
on_commandClicked(QString("紫外告警控制指令"),114,5,id,cmd,extent,level,0,180,0);
on_pushButton_SendCommand_clicked();
*/
//发送到encap
QByteArray uv_encap;
uv_encap.clear();
for(int i = 0;i< 13;i++)
{
uv_encap[i] = UV_Frame[i];
}
//qDebug() << "send uv " << uv_encap;
emit send_EnCapData(0x09,uv_encap);
}
}
}
}
}
});
}
else
{
qDebug() << "绑定失败:" << UV_Sock->errorString();
showMessage("绑定失败:" + UV_Sock->errorString(),5000);
}
}
});
connect(ui->pushButton_uv_close,&QPushButton::clicked,this,[=](){
//输出关闭
if(UV_Sock)
{
UV_Sock->abort();
delete UV_Sock;
UV_Sock = nullptr;
showMessage("紫外信息输出端口关闭",5000);
}
});
connect(ui->pushButton_uv_power_on,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("上电"),114,1,1,0,0,0,0,180,0);
});
connect(ui->pushButton_uv_power_off,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("下电"),114,1,0,0,0,0,0,180,0);
});
/*connect(ui->pushButton_uv_uploadthreat,&QPushButton::clicked,this,[=](){
uint8_t level = ui->lineEdit_uv_set_level->text().toInt();
uint8_t extent = ui->lineEdit_uv_set_extent->text().toInt();
on_commandClicked(QString("上传阈值"),114,2,level,extent,0,0,0,180,0);
});
*/
connect(ui->pushButton_uv_uploadwarning,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("注入紫外告警信号"),114,3,1,0,0,0,0,180,0);
});
connect(ui->pushButton_uv_cancel_uploadwarning,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("取消注入紫外告警信号"),114,3,0,0,0,0,0,180,0);
});
connect(ui->pushButton_uv_open_maneuver,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("自动逃逸机动开启"),114,4,1,0,0,0,0,180,0);
});
connect(ui->pushButton_uv_close_maneuver,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("自动逃逸机动关闭"),114,4,0,0,0,0,0,180,0);
});
connect(ui->pushButton_uv_fore_maneuver,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("地面站雷达告警控制指令"),112,3,0,0,0,0,0,180,0);
});
connect(ui->pushButton_uv_exit_fore_maneuver,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("地面站雷达告警控制指令"),112,2,0,0,0,0,0,180,0);
});
//================================================
connect(ui->pushButton_flare_self_check,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("自检"),115,1,0,0,0,0,0,180,0);
});
connect(ui->pushButton_flare_circuit_on,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("保险开"),115,2,1,0,0,0,0,180,0);
});
connect(ui->pushButton_flare_circuit_off,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("保险关"),115,2,0,0,0,0,0,180,0);
});
connect(ui->pushButton_flare_release_time_set,&QPushButton::clicked,this,[=](){
uint16_t time = ui->lineEdit_flare_release_time->text().toInt();
if(time > 60000)
{
time = 60000;
}
on_commandClicked(QString("自动释放时间间隔(ms)设置"),115,3,time,0,0,0,0,180,0);
});
connect(ui->pushButton_flare_on,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("告警后自动释放-开"),115,4,1,0,0,0,0,180,0);
});
connect(ui->pushButton_flare_off,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("告警后自动释放-关"),115,4,0,0,0,0,0,180,0);
});
connect(ui->pushButton_flare_manrelease_set,&QPushButton::clicked,this,[=](){
uint16_t time = ui->lineEdit_flare_manrelease_time->text().toInt();
if(time > 60000)
{
time = 60000;
}
on_commandClicked(QString("手动释放时间间隔(ms)设置"),115,5,time,0,0,0,0,180,0);
});
connect(ui->pushButton_flare_manrelease,&QPushButton::clicked,this,[=](){
on_commandClicked(QString("手动释放"),115,6,1,flare_release_status,0,0,0,180,0);
});
//=================================================
connect(ui->pushButton_flare_release_bom1,&QPushButton::clicked,this,[=](){
quint32 bitmask = 0x01;
if((flare_release_status & bitmask) == 0x00)
{
flare_release_status |= bitmask;
}
else
{
flare_release_status &= ~bitmask;
}
setColor(ui->pushButton_flare_release_bom1,(flare_release_status & bitmask)?(green_state):(white_state));
qDebug() << "flare_release_status" << flare_release_status;
});
connect(ui->pushButton_flare_release_bom2,&QPushButton::clicked,this,[=](){
quint32 bitmask = 0x02;
if((flare_release_status & bitmask) == 0x00)
{
flare_release_status |= bitmask;
}
else
{
flare_release_status &= ~bitmask;
}
setColor(ui->pushButton_flare_release_bom2,(flare_release_status & bitmask)?(green_state):(white_state));
qDebug() << "flare_release_status" << flare_release_status;
});
connect(ui->pushButton_flare_release_bom3,&QPushButton::clicked,this,[=](){
quint32 bitmask = 0x04;
if((flare_release_status & bitmask) == 0x00)
{
flare_release_status |= bitmask;
}
else
{
flare_release_status &= ~bitmask;
}
setColor(ui->pushButton_flare_release_bom3,(flare_release_status & bitmask)?(green_state):(white_state));
qDebug() << "flare_release_status" << flare_release_status;
});
connect(ui->pushButton_flare_release_bom4,&QPushButton::clicked,this,[=](){
quint32 bitmask = 0x08;
if((flare_release_status & bitmask) == 0x00)
{
flare_release_status |= bitmask;
}
else
{
flare_release_status &= ~bitmask;
}
setColor(ui->pushButton_flare_release_bom4,(flare_release_status & bitmask)?(green_state):(white_state));
qDebug() << "flare_release_status" << flare_release_status;
});
connect(ui->pushButton_flare_release_bom5,&QPushButton::clicked,this,[=](){
quint32 bitmask = 0x10;
if((flare_release_status & bitmask) == 0x00)
{
flare_release_status |= bitmask;
}
else
{
flare_release_status &= ~bitmask;
}
setColor(ui->pushButton_flare_release_bom5,(flare_release_status & bitmask)?(green_state):(white_state));
qDebug() << "flare_release_status" << flare_release_status;
});
connect(ui->pushButton_flare_release_bom6,&QPushButton::clicked,this,[=](){
quint32 bitmask = 0x20;
if((flare_release_status & bitmask) == 0x00)
{
flare_release_status |= bitmask;
}
else
{
flare_release_status &= ~bitmask;
}
setColor(ui->pushButton_flare_release_bom6,(flare_release_status & bitmask)?(green_state):(white_state));
qDebug() << "flare_release_status" << flare_release_status;
});
}
void Payload::setup_actions(void)
{
ra_timer = new QTimer();
ra_timer->setInterval(500);
connect(ra_timer,&QTimer::timeout,this,[=](){
if((ra_status & 0x01) == 0x01)//前16为做状态,后16后做指示
{
if((ra_status & 0x010000) == 0x010000)
{
setColor(ui->label_radar_status,state::warning);
ra_status &= ~0x010000;
}
else
{
setColor(ui->label_radar_status,state::inital);
ra_status |= 0x010000;
}
}
else
{
ra_timer->stop();
setColor(ui->label_radar_status,state::inital);
}
});
uv_timer = new QTimer();
uv_timer->setInterval(500);
connect(uv_timer,&QTimer::timeout,this,[=](){
if((uv_status & 0x01) == 0x01)//前16为做状态,后16后做指示
{
if((uv_status & 0x010000) == 0x010000)
{
setColor(ui->label_uv_status,state::warning);
uv_status &= ~0x010000;
}
else
{
setColor(ui->label_uv_status,state::inital);
uv_status |= 0x010000;
}
}
else
{
uv_timer->stop();
setColor(ui->label_uv_status,state::inital);
}
});
}
void Payload::Radar_Status(quint32 flag)
{
if(flag == 0x01)//闪烁
{
if(!ra_timer->isActive())
{
ra_timer->start();
}
ra_status |= 0x01;
}
else
{
ra_status &= ~0x01;
}
}
void Payload::UV_Status(quint32 flag)
{
if(flag == 0x01)//闪烁
{
if(!uv_timer->isActive())
{
uv_timer->start();
}
uv_status |= 0x01;
}
else
{
uv_status &= ~0x01;
}
}
void Payload::commandAccepted(bool flag,uint16_t command,uint8_t result)
{
bool isFundSender = false;
QString string;
//找到消息的发送者
//QObjectList list = ui->frame->children();
// qDebug() << list;
//qDebug() << CommandBox.findChildren();
if(command == m_command)
{
isFundSender = true;
switch (result) {
case MAV_RESULT_ACCEPTED:
string.append(tr("%1,%2 accepted and executed").arg(command).arg(m_name));
break;
case MAV_RESULT_TEMPORARILY_REJECTED:
string.append(tr("%1,%2 rejected").arg(command).arg(m_name));
break;
case MAV_RESULT_DENIED:
string.append(tr("%1,%2 permanently denied").arg(command).arg(m_name));
break;
case MAV_RESULT_UNSUPPORTED:
string.append(tr("%1,%2 unsupported").arg(command).arg(m_name));
break;
case MAV_RESULT_FAILED:
string.append(tr("%1,%2 failed").arg(command).arg(m_name));
break;
case MAV_RESULT_IN_PROGRESS:
string.append(tr("%1,%2 being executed").arg(command).arg(m_name));
break;
case 0xFE:
string.append(tr("%1,%2 time out").arg(command).arg(m_name));
break;
case 0xFF:
string.append(tr("Please do not operate too fast, the last instruction has not been sent"));
break;
default:
break;
}
ui->lineEdit_CommandName->clear();
m_name.clear();
m_param1 = 0;
m_param2 = 0;
m_param3 = 0;
m_param4 = 0;
m_param5 = 0;
m_param6 = 0;
m_param7 = 0;
m_command = 0;
m_confirm = 0;
if(string.size() > 0)
{
emit say(string);
emit showMessage(string);
}
}
/*
if(string.size() > 0)
{
QTextToSpeech *tts = new QTextToSpeech();
tts->say(string);
tts->deleteLater();
emit showMessage(string);
}
*/
}