#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) { //rwr:id为8 //uvwd:id为9 switch (seq) { case 0x08://rwr { uint8_t msg[50]; uint8_t len = 30; for(int i = 0;iisOpen())) { //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;iisOpen()) { //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(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(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); } */ }