Newer
Older
ZXSSCJ / CounterAcq / CounterWindow.cpp
#include "CounterWindow.h"
#include "ui_CounterWindow.h"

#include <iostream>
#include <QTimer>
#include <QDateTime>
#include <QLabel>
#include <QPushButton>
#include <QTableView>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QHeaderView>
#include <QDesktopWidget>

CounterWindow::CounterWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CounterWindow)
{
    ui->setupUi(this);

    QRect screenRect = QApplication::desktop()->screenGeometry();
    resize(screenRect.width(), 700);

    QString portNames = SettingConfig::getInstance().PORT_NAMES;
    int baudRate = SettingConfig::getInstance().BAUD_RATE;
    QString devCodes = SettingConfig::getInstance().DEV_CODES;

    QStringList comDevList = portNames.split(",");
    QStringList devCodeList = devCodes.split(",");

    for (int i = 0; i < comDevList.size(); i++)
    {
        CounterDevice * device = new CounterDevice(this);

        //
        connect(device, &CounterDevice::sendDataToDraw,
                this, &CounterWindow::drawCounterDataOnPage);

        device->setComName(comDevList.at(i));
        device->setBaudRate(baudRate);

        device->setDevCode(devCodeList.at(i));

        this->deviceList.append(device);

        device->initSerialPort();
//        device->startWork();
    }

    for (int i = 0; i < this->deviceList.size(); i++)
    {
        QWidget * devWidget = new QWidget(this->ui->stackedWidget);
        ui->stackedWidget->addWidget(devWidget);
        devWidgetList.append(devWidget);

        this->generateWidgetForDevice(devCodeList.at(i), i);
    }

//    timer = new QTimer(this);
//    timer->start(1000 * 10);
}

CounterWindow::~CounterWindow()
{
    delete ui;
}

void CounterWindow::mockOneFrame()
{
    qlonglong deviceId = 9101;

    QKafkaUtil * kafkaUtil = new QKafkaUtil(this);
    kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS);
    kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC);
    kafkaUtil->createProducer();

    QDateTime now = QDateTime::currentDateTime();

    QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000);
    qlonglong ts = now.toMSecsSinceEpoch();

    for (int i = 0; i < 16; i++) {
        CounterDataDto channelDataDto;

        channelDataDto.devCode = deviceId;

        channelDataDto.frameId = frameId;
        channelDataDto.channelData = qrand() % 400;
        channelDataDto.channelRefId = 0;
        channelDataDto.channelId = i;
        channelDataDto.milisecond = ts;
        channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ");

        QJsonObject dtoJson = channelDataDto.toJSON();
        dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID);
        dtoJson.insert("deviceId", deviceId);

        std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl;

        kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)));
    }
}

void CounterWindow::generateWidgetForDevice(QString devCode, int index)
{
    // 顶部切换widget
    QWidget * switchWidget = new QWidget(this->devWidgetList.at(index));
    switchWidget->setGeometry(0, 0, 1024, 50);

    // 显示数据的区域
    QWidget * gridWidget = new QWidget(this->devWidgetList.at(index));
    gridWidget->setGeometry(0, 50, 1024, 670);

    // 顶部水平布局,用于排布按钮
    QHBoxLayout * hLayout = new QHBoxLayout(switchWidget);

    // 文本
    QLabel * label = new QLabel(switchWidget);
    label->setText("设备编号:" + devCode);
    label->setFont(QFont("微软雅黑", 12));
    hLayout->addWidget(label);

    // 按钮
    for (int i = 0; i < this->deviceList.size(); i++)
    {
        QPushButton * butt5 = new QPushButton(this->deviceList.at(i)->getDevCode());
        hLayout->addWidget(butt5);

        connect(butt5, &QPushButton::clicked, [=](){
            this->ui->stackedWidget->setCurrentIndex(i);
        });
    }

    // Grid布局
    QGridLayout * gridLayout = new QGridLayout(gridWidget);
    gridLayout->setSpacing(10);

    QList<QStandardItemModel *> channelModelList;
    QStringList labels = QObject::trUtf8("时间,clock").simplified().split(",");

    for (int i = 0; i < 16; i++)
    {
        QTableView * channelTable = new QTableView(gridWidget);
        QStandardItemModel * model = new QStandardItemModel(channelTable);

        model->setHorizontalHeaderLabels(labels);

        channelTable->setModel(model);

        gridLayout->addWidget(channelTable, i / 4, i % 4);

        channelTable->verticalHeader()->hide();
        channelTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
        channelTable->scrollToBottom();

        channelModelList.append(model);
    }

    this->tableModelList.append(channelModelList);
}

void CounterWindow::drawCounterDataOnPage(CounterDataDto * counterData)
{
    // 1. 判断数据属于哪个设备,显示在不同的widget上

    // 2. 循环设置各个tableView
    QList<QStandardItemModel *> devChannels = this->tableModelList.at(0); // 暂时写死
    QList<QStandardItem *> row;
    QStandardItem * itemTm = 0;
    QStandardItem * itemData = 0;
    itemTm = new QStandardItem(QString("%1").arg(counterData->timestamp.mid(11, 12)));
    itemData = new QStandardItem(QString("%1").arg(counterData->channelData));

    row.append(itemTm);
    row.append(itemData);

    QStandardItemModel * model;
    model = devChannels.at(counterData->channelId - 1);
    if (model->rowCount() >= 20)
    {
        model->removeRows(0, model->rowCount());
    }

    model->insertRow(0, row);


//    for (int i = 0; i < counterData->channelData.size(); i++)
//    {
//        if (counterData->channelActive.at(i).toInt() == 1)
//        {
//            QList<QStandardItem *> row;
//            QStandardItem * item = 0;
//            QStandardItem * item2 = 0;
//            item = new QStandardItem(QString("%1").arg(counterData->timestamp.mid(11, 12)));
//            item2 = new QStandardItem(QString("%1").arg(counterData->channelData.at(i)));

//            row.append(item);
//            row.append(item2);

//            QStandardItemModel * model;
//            model = devChannels.at(i);
//            if (model->rowCount() >= 60)
//            {
//                model->removeRows(0, model->rowCount());
//            }

//            model->insertRow(0, row);
//        }
//    }
}