You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
4.9 KiB

2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
  1. #include "mainwindow.h"
  2. #include <QDateTime>
  3. #include <QMessageBox>
  4. #include <QtConcurrent>
  5. #include <QtSerialPort/QSerialPort>
  6. #include <QtSerialPort/QSerialPortInfo>
  7. #include "./ui_mainwindow.h"
  8. #include "camera_light_src_timing_controller/qt_serial_datachannel.hpp"
  9. #include "logger.hpp"
  10. #include "xsync_regs.hpp"
  11. using namespace iflytop;
  12. using namespace clst;
  13. using namespace std;
  14. static MainWindow *m_mainWindow;
  15. #define TAG "MainWindow"
  16. static const char *fmt(const char *fmt, ...) {
  17. va_list args;
  18. va_start(args, fmt);
  19. static char buf[1024] = {0};
  20. vsnprintf(buf, sizeof(buf), fmt, args);
  21. va_end(args);
  22. return buf;
  23. }
  24. static const uint32_t str2int(QString str) {
  25. // 如果0x开头,按16进制转换
  26. // 如果0b开头,按2进制转换
  27. // 否则按10进制转换
  28. // 去除掉str中_
  29. str.remove("_");
  30. if (str.startsWith("0x")) {
  31. return str.toUInt(nullptr, 16);
  32. } else if (str.startsWith("0b")) {
  33. // remove 0b
  34. str.remove(0, 2);
  35. return str.toUInt(nullptr, 2);
  36. } else {
  37. return str.toUInt(nullptr, 10);
  38. }
  39. }
  40. static QSerialPort G_SerialPort;
  41. static QTDataChannel G_QTDataChannel;
  42. void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
  43. // QString text;
  44. // text.append(msg);
  45. }
  46. // void MainWindow::append_log_slot(QString text) { ui->logbrowser->append(text); }
  47. void MainWindow::doinui_slot(QFunction func) {
  48. if (func.get()) func.get()();
  49. }
  50. void MainWindow::constructUI() {
  51. /*******************************************************************************
  52. * serialPortCB *
  53. *******************************************************************************/
  54. const auto infos = QSerialPortInfo::availablePorts();
  55. for (const QSerialPortInfo &info : infos) {
  56. ui->serialPortCB->addItem(info.portName());
  57. }
  58. /*******************************************************************************
  59. * *
  60. *******************************************************************************/
  61. ui->serialBaudrateCB->addItem("9600");
  62. ui->serialBaudrateCB->addItem("14400");
  63. ui->serialBaudrateCB->addItem("19200");
  64. ui->serialBaudrateCB->addItem("38400");
  65. ui->serialBaudrateCB->addItem("57600");
  66. ui->serialBaudrateCB->addItem("115200");
  67. ui->serialBaudrateCB->setCurrentIndex(5);
  68. /*******************************************************************************
  69. * *
  70. *******************************************************************************/
  71. connect(ui->serialPortRefreshKey, &QPushButton::clicked, this, [this](bool check) {
  72. ui->serialPortCB->clear();
  73. const auto infos = QSerialPortInfo::availablePorts();
  74. for (const QSerialPortInfo &info : infos) {
  75. ui->serialPortCB->addItem(info.portName());
  76. }
  77. });
  78. /*******************************************************************************
  79. * *
  80. *******************************************************************************/
  81. connect(ui->serialOpenKey, &QPushButton::clicked, this, [=](bool check) {
  82. // 打开串口
  83. if (ui->serialOpenKey->text() == "打开") {
  84. G_SerialPort.setPortName(ui->serialPortCB->currentText());
  85. if (G_SerialPort.open(QIODevice::ReadWrite)) {
  86. G_SerialPort.setBaudRate(ui->serialBaudrateCB->currentText().toInt());
  87. G_SerialPort.setDataBits(QSerialPort::Data8);
  88. G_SerialPort.setParity(QSerialPort::NoParity);
  89. G_SerialPort.setFlowControl(QSerialPort::NoFlowControl);
  90. G_SerialPort.setStopBits(QSerialPort::OneStop);
  91. } else {
  92. QMessageBox::about(NULL, "提示", "串口无法打开,串口不存在或已被占用");
  93. return;
  94. }
  95. ui->serialOpenKey->setText("关闭");
  96. // 下拉菜单控件使能
  97. ui->serialBaudrateCB->setEnabled(false);
  98. ui->serialPortCB->setEnabled(false);
  99. ui->serialPortRefreshKey->setEnabled(false);
  100. } else {
  101. G_SerialPort.close();
  102. ui->serialOpenKey->setText("打开");
  103. ui->serialBaudrateCB->setEnabled(true);
  104. ui->serialPortCB->setEnabled(true);
  105. ui->serialPortRefreshKey->setEnabled(true);
  106. }
  107. });
  108. }
  109. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
  110. G_QTDataChannel.bind(&G_SerialPort);
  111. CLSTControler::ins()->initialize(&G_QTDataChannel);
  112. ui->setupUi(this);
  113. m_mainWindow = this;
  114. qRegisterMetaType<int32_t>("int32_t");
  115. qRegisterMetaType<uint32_t>("uint32_t");
  116. qRegisterMetaType<function<void()>>("function<void()>");
  117. qRegisterMetaType<QFunction>("QFunction");
  118. // qInstallMessageHandler(log_output);
  119. connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
  120. constructUI();
  121. }
  122. MainWindow::~MainWindow() { delete ui; }