#include "commandwidget.h" #include "ui_commandwidget.h" #include #include "utils/switchbutton.h" CommandWidget::CommandWidget(QWidget *parent) : QWidget(parent), ui(new Ui::CommandWidget) { ui->setupUi(this); m_commandUdpSocket = new QUdpSocket(this); // 将套接字绑定到指定端口 if (m_commandUdpSocket->bind(QHostAddress::Any, 1200)) { qDebug() << "UDP 套接字已绑定到端口 1200"; } else { qDebug() << "绑定 UDP 套接字失败"; } //创建自定义套接字 m_CUdpSocket = new CUdpSocket(this); initmUdpParam(); } CommandWidget::~CommandWidget() { delete ui; if (m_commandUdpSocket) m_commandUdpSocket->deleteLater(); } void CommandWidget::receiveMessageSlots(QString message, int type) { emit sendErrorMessage(message, type); } unsigned char CommandWidget::getCrc(quint8 *data, quint8 length) { quint16 crc = 0; int i = 0; while (length-- > 0) { crc = CRC8TAB[crc ^ (data[i] & 0x00FF)]; i++; } return crc & 0x00ff; } ProtocalKB CommandWidget::EncodeCommandCmd(quint8 cmd) { std::unique_ptr pBuff = std::make_unique(); pBuff->head[0] = PROTOCOL_HEAD_0; pBuff->head[1] = PROTOCOL_HEAD_1; pBuff->reserved = PROTOCOL_RESERVED; pBuff->data[0] = cmd; pBuff->data[1] = cmd; pBuff->data[2] = cmd; pBuff->curPage = PROTOCOL_CUR_PAGE; quint8 *ptr = reinterpret_cast(&pBuff); pBuff->CHKSUM = getCrc(ptr, sizeof(pBuff) - sizeof(pBuff->CHKSUM)); return *pBuff; } bool CommandWidget::writeBufferToClient(const QByteArray &data) { // 目标地址和端口 QHostAddress destination("172.10.1.216"); // 目标 IP 地址 quint16 port = 9003; // 目标端口 // 发送数据 qint64 bytesSent = m_commandUdpSocket->writeDatagram(data, destination, port); if (bytesSent == -1) { qDebug() << "发送失败:" << m_commandUdpSocket->errorString(); return false; } else { qDebug() << "发送成功,字节数:" << bytesSent; return true; } } void CommandWidget::buttonResponse(quint8 cmd) { ProtocalKB packet = EncodeCommandCmd(cmd); // 将 ProtocalKB 结构体转换为 QByteArray QByteArray data; data.append(reinterpret_cast(&packet), sizeof(ProtocalKB)); for (int i = 0; i < 3; i++) { writeBufferToClient(data); } } void CommandWidget::receiveUavTypeIndex(int index) { switch (index) { case FP98: ui->cmdStackedWidget->setCurrentWidget(ui->stackedWidgetPage1); break; case MEDICAL_UNIVERSITY: ui->cmdStackedWidget->setCurrentWidget(ui->stackedWidgePage2); break; default: break; } } void CommandWidget::on_pushButton_clicked() { buttonResponse(0x75); } void CommandWidget::on_pushButton_2_clicked() { buttonResponse(0x76); } void CommandWidget::on_pushButton_5_clicked() { buttonResponse(0x7D); } void CommandWidget::on_pushButton_6_clicked() { buttonResponse(0x7C); } void CommandWidget::on_pushButton_10_clicked() { buttonResponse(0x69); } void CommandWidget::on_pushButton_9_clicked() { buttonResponse(0x6A); } void CommandWidget::on_pushButton_4_clicked() { buttonResponse(0x77); } void CommandWidget::on_pushButton_3_clicked() { buttonResponse(0x78); } void CommandWidget::on_pushButton_14_clicked() { buttonResponse(0x79); } void CommandWidget::on_pushButton_13_clicked() { buttonResponse(0xC6); } void CommandWidget::on_pushButton_17_clicked() { buttonResponse(0x66); } void CommandWidget::on_pushButton_8_clicked() { buttonResponse(0x67); } void CommandWidget::on_pushButton_7_clicked() { buttonResponse(0x68); } void CommandWidget::on_pushButton_12_clicked() { buttonResponse(0x7B); } void CommandWidget::on_pushButton_11_clicked() { buttonResponse(0x7A); } void CommandWidget::on_pushButton_16_clicked() { buttonResponse(0xC8); } void CommandWidget::on_pushButton_15_clicked() { buttonResponse(0xC9); } /** 武汉天进吊舱 */ void CommandWidget::on_pushButton_left_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), m_protocolPodTJ.cmdLeft(ui->cmdSlider->value()))); } void CommandWidget::on_pushButton_left_released() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), QByteArray::fromHex("00000000"))); } void CommandWidget::on_pushButton_right_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), m_protocolPodTJ.cmdRight(ui->cmdSlider->value()))); } void CommandWidget::on_pushButton_right_released() { on_pushButton_left_released(); } void CommandWidget::on_pushButton_up_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), m_protocolPodTJ.cmdUp(ui->cmdSlider->value()))); } void CommandWidget::on_pushButton_up_released() { on_pushButton_left_released(); } void CommandWidget::on_pushButton_down_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), m_protocolPodTJ.cmdDown(ui->cmdSlider->value()))); } void CommandWidget::on_pushButton_down_released() { on_pushButton_left_released(); } void CommandWidget::on_pushButton_center_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7100"))); } void CommandWidget::on_pushButton_guid_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7200"), m_protocolPodTJ.digitalGuid(ui->guidLineEdit->text().toInt(), ui->poseLineEdit->text().toInt()))); } void CommandWidget::on_pushButton_pose_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7C00"), m_protocolPodTJ.digitalGuid(ui->guidLineEdit->text().toInt(), ui->poseLineEdit->text().toInt()))); } void CommandWidget::on_pushButton_directL_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7A00"))); } void CommandWidget::on_pushButton_directS_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7B00"))); } void CommandWidget::on_pushButton_lookDown_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7300"))); } void CommandWidget::on_pushButton_packUp_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7400"))); } void CommandWidget::on_pushButton_scanning_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7900"))); } void CommandWidget::on_pushButton_close_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7500"))); } void CommandWidget::on_comboBox1_activated(int index) { if (index >= 0) { QByteArray data = ui->comboBox1->currentData().toByteArray(); //qDebug() << data.toHex(); m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("2300"),data)); } } void CommandWidget::on_comboBox2_activated(int index) { if (index >= 0) { QByteArray data = ui->comboBox2->currentData().toByteArray(); //qDebug() << data.toHex(); m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("2500"), data)); } } void CommandWidget::on_pushButton_videoSwitch_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3100"))); } void CommandWidget::on_pushButton_video_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3300"))); } void CommandWidget::on_pushButton_photo_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3200"))); } void CommandWidget::on_pushButton_zoomp_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"), m_protocolPodTJ.cmdZoom(0x01,ui->comboBox3->currentIndex()))); } void CommandWidget::on_pushButton_zoomp_released() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"))); } void CommandWidget::on_pushButton_zoomd_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"), m_protocolPodTJ.cmdZoom(0x02, ui->comboBox3->currentIndex()))); } void CommandWidget::on_pushButton_zoomd_released() { on_pushButton_zoomp_released(); } void CommandWidget::on_pushButton_focusP_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"), m_protocolPodTJ.cmdZoom(0x03, ui->comboBox3->currentIndex()))); } void CommandWidget::on_pushButton_focusP_released() { on_pushButton_zoomp_released(); } void CommandWidget::on_pushButton_focusD_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"), m_protocolPodTJ.cmdZoom(0x04, ui->comboBox3->currentIndex()))); } void CommandWidget::on_pushButton_focusD_released() { on_pushButton_zoomp_released(); } void CommandWidget::on_pushButton_auto_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4500"), m_protocolPodTJ.cmdZoom(0x05, 0x00))); } void CommandWidget::on_pushButton_auto_released() { on_pushButton_zoomp_released(); } void CommandWidget::on_pushButton_contrastP_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), QByteArray::fromHex("01010000"))); } void CommandWidget::on_pushButton_contrastD_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), QByteArray::fromHex("01020000"))); } void CommandWidget::on_pushButton_lightP_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), QByteArray::fromHex("02010000"))); } void CommandWidget::on_pushButton_lightD_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), QByteArray::fromHex("02020000"))); } void CommandWidget::on_comboBox4_activated(int index) { if (index >= 0) { QByteArray data = ui->comboBox4->currentData().toByteArray(); //qDebug() << data.toHex(); m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4A00"), data)); } } void CommandWidget::on_pushButton_zoomp_2_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5000"), QByteArray::fromHex("0F000000"))); } void CommandWidget::on_pushButton_zoomp_2_released() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5000"), QByteArray::fromHex("00000000"))); } void CommandWidget::on_pushButton_zoomd_2_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5000"), QByteArray::fromHex("10000000"))); } void CommandWidget::on_pushButton_zoomd_2_released() { on_pushButton_zoomp_2_released(); } void CommandWidget::on_pushButton_contrastP_2_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5A00"))); } void CommandWidget::on_pushButton_contrastD_2_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5A00"), QByteArray::fromHex("01000000"))); } void CommandWidget::on_pushButton_color_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5300"))); } void CommandWidget::on_comboBox5_activated(int index) { if (index >= 0) { QByteArray data = ui->comboBox5->currentData().toByteArray(); m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("5300"), data)); } } void CommandWidget::on_pushButton_distance_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3D00"))); } void CommandWidget::on_pushButton_distanceC_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3E00"), m_protocolPodTJ.cmdLaser(ui->comboBox6->currentIndex() + 1))); } void CommandWidget::on_pushButton_distanceS_pressed() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3F00"))); } void CommandWidget::on_cmdLineEdit_textChanged(const QString text) { qDebug() << text; if (text.toInt() < 10)//数据小于10不响应 { return; } ui->cmdSlider->setMaximum(text.toInt()); } void CommandWidget::setPodIPConfig(NetworkIPStruct networkIP, bool isConnect) { qDebug() << "ip设置槽函数调用了"; if (!isConnect) { m_CUdpSocket->close(); return; } if (m_CUdpSocket->close()) { if (!m_CUdpSocket->bind(networkIP.localIP, networkIP.localPort)) { qDebug() << "端口号绑定失败"; } if (!m_CUdpSocket->joinMulticast()) { qDebug() << "加入组播失败"; } //绑定目标IP Port m_CUdpSocket->setTargetInfo(networkIP.remoteIP, networkIP.remotePort); } } void CommandWidget::setMoveParm(QPointF size) { int x = std::clamp(static_cast(size.x() / 10), -60, 60); int y = std::clamp(static_cast(-size.y() / 10), -60, 60); qDebug() << "缩减之后的屏幕滑动参数==>" << "x:" << x << "y:" << y; m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("7000"), m_protocolPodTJ.cmdServo(x, y))); } void CommandWidget::stopServo() { on_pushButton_left_released(); } void CommandWidget::setTargetTracking(double dir, double pitch) { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3A00"), m_protocolPodTJ.targetTracking(static_cast(std::round(dir)), static_cast(std::round(pitch))))); } void CommandWidget::setStopTracking() { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("3B00"))); } /***武汉天进吊舱控制***/ void CommandWidget::initmUdpParam() { QIntValidator* validator = new QIntValidator(0, 100, this); ui->cmdLineEdit->setValidator(validator); ui->cmdLineEdit->setText("40"); ui->cmdSlider->setValue(20); //AI开关 connect(ui->switchButton1, &WBSwitchButton::sigSwitchChanged, this, [=](bool onOroff){ if (onOroff) //开关打开 { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("9100"), QByteArray::fromHex("01000000"))); } else { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("9100"))); } }); ui->comboBox1->addItem("16 * 16", QByteArray::fromHex("01000000")); ui->comboBox1->addItem("32 * 32", QByteArray::fromHex("02000000")); ui->comboBox1->addItem("64 * 64", QByteArray::fromHex("03000000")); ui->comboBox1->addItem("128 * 128", QByteArray::fromHex("04000000")); ui->comboBox2->addItem("红外", QByteArray::fromHex("00000000")); ui->comboBox2->addItem("可见光", QByteArray::fromHex("01000000")); ui->comboBox2->addItem("上下分屏", QByteArray::fromHex("02000000")); ui->comboBox2->addItem("画中画1", QByteArray::fromHex("03000000")); ui->comboBox2->addItem("画中画2", QByteArray::fromHex("04000000")); ui->comboBox2->addItem("左右分屏", QByteArray::fromHex("05000000")); ui->comboBox3->setCurrentIndex(4); //低照度 connect(ui->btn_light, &WBSwitchButton::sigSwitchChanged, this, [=](bool onOroff) { if (onOroff) //开关打开 { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4B00"), QByteArray::fromHex("01000000"))); } else { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4B00"))); } }); //电子稳像 connect(ui->btn_stable, &WBSwitchButton::sigSwitchChanged, this, [=](bool onOroff) { if (onOroff) //开关打开 { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), QByteArray::fromHex("04010000"))); } else { m_CUdpSocket->sendData(ProtocolPodTJ::encode(QByteArray::fromHex("4100"), QByteArray::fromHex("04020000"))); } }); //图像去雾 ui->comboBox4->addItem("关", QByteArray::fromHex("00000000")); ui->comboBox4->addItem("低", QByteArray::fromHex("01000000")); ui->comboBox4->addItem("中", QByteArray::fromHex("02000000")); ui->comboBox4->addItem("强", QByteArray::fromHex("03000000")); //伪彩选择 ui->comboBox5->addItem("白热", QByteArray::fromHex("01000000")); ui->comboBox5->addItem("黑热", QByteArray::fromHex("01010000")); ui->comboBox5->addItem("蓝红黄", QByteArray::fromHex("01020000")); ui->comboBox5->addItem("紫红黄", QByteArray::fromHex("01030000")); ui->comboBox5->addItem("蓝绿红", QByteArray::fromHex("01040000")); ui->comboBox5->addItem("彩虹1", QByteArray::fromHex("01050000")); ui->comboBox5->addItem("彩虹2", QByteArray::fromHex("01060000")); ui->comboBox5->addItem("黑-红", QByteArray::fromHex("01070000")); ui->comboBox5->addItem("墨绿-红", QByteArray::fromHex("01080000")); ui->comboBox5->addItem("蓝绿红-粉", QByteArray::fromHex("01090000")); ui->comboBox5->addItem("混合色", QByteArray::fromHex("010A0000")); ui->comboBox5->addItem("红头", QByteArray::fromHex("010B0000")); }