Ai
2 Star 0 Fork 0

xrfid/fmTools

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
dialog.cpp 12.95 KB
一键复制 编辑 原始数据 按行查看 历史
jacky 提交于 2024-10-29 17:33 +08:00 . update dll
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
#include "dialog.h"
#include "defer.h"
#include "types.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QStandardItemModel>
#include <QThread>
#include <QtConcurrent/QtConcurrent>
#include "factory.h"
#include "rfid.h"
void setLayoutEnable(QLayout* layout, bool enable)
{
for (int index = 0; index < layout->count(); ++index)
{
auto item = layout->itemAt(index)->widget();
if (item)
{
item->setEnabled(enable);
}
}
}
Dialog::Dialog(QWidget* parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->comboBox_port->installEventFilter(this);
// init serial ports
updatePorts();
adjustTimer = new QTimer;
adjustTimer->connect(
adjustTimer,
&QTimer::timeout,
this,
[&] { ui->label_TimeCost->setText(QString("%1秒").arg(startTime.secsTo(QTime::currentTime()))); });
// init tree view
proxyModel = new QSortFilterProxyModel;
model = new QStandardItemModel(0, 4, this);
model->setHeaderData(0, Qt::Horizontal, QObject::tr("c50"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("c51"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("c54"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("power"));
proxyModel->setSourceModel(model);
ui->treeView_params->setRootIsDecorated(false);
ui->treeView_params->setAlternatingRowColors(true);
ui->treeView_params->setModel(proxyModel);
ui->treeView_params->setSortingEnabled(true);
qRegisterMetaType<AdjustParam>("AdjustParam");
qDebug() << "main thread id: " << QThread::currentThreadId();
connect(this, &Dialog::progressChanged, this, [&](int value) { ui->progressBar->setValue(value); });
connect(this, &Dialog::adjustMessageChanged, this, &Dialog::onAdjustMessageChanged);
connect(this, &Dialog::newAdjustParam, this, &Dialog::onNewAdjustParam);
connect(
this,
&Dialog::adjustStarted,
this,
[&]
{
setLayoutEnable(ui->gridLayout_reg, false);
setLayoutEnable(ui->horizontalLayout_connect, false);
setLayoutEnable(ui->horizontalLayout_collect_param, false);
ui->pushButton_startAdjust->setEnabled(false);
ui->pushButton_endAdjust->setEnabled(true);
});
connect(
this,
&Dialog::adjustEnd,
this,
[&]
{
setLayoutEnable(ui->gridLayout_reg, true);
setLayoutEnable(ui->horizontalLayout_connect, true);
setLayoutEnable(ui->horizontalLayout_collect_param, true);
ui->pushButton_startAdjust->setEnabled(true);
ui->pushButton_endAdjust->setEnabled(false);
adjustTimer->stop();
});
connect(this, &Dialog::connectStateChanged, this, &Dialog::onConnectStateChanged);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::updatePorts()
{
// last selected
auto lastSelectItemText = ui->comboBox_port->currentText();
ui->comboBox_port->clear();
auto ports = QSerialPortInfo::availablePorts();
if (ports.empty())
{
return;
}
for (auto& port : ports)
{
ui->comboBox_port->addItem(port.portName());
}
for (int index = 0; index < ports.length(); ++index)
{
if (ports[index].portName() == lastSelectItemText)
{
ui->comboBox_port->setCurrentIndex(index);
}
}
if (lastSelectItemText.isEmpty() || lastSelectItemText.isNull())
{
ui->comboBox_port->setCurrentIndex(ports.length() - 1);
}
}
void Dialog::peak()
{
visa_peak(instr, 1);
visa_run(instr, (char*)":CALCulate:MARKer1:MODE POSition", false);
}
void Dialog::initSpectrumAnalyzer()
{
updateAdjustMessage("初始化频谱仪设置......");
visa_set_freq_start(instr, 900000000);
visa_set_freq_end(instr, 930000000);
visa_set_r_level(instr, 35);
visa_set_r_level_offset(instr, 30.3);
peak();
}
void Dialog::onNewAdjustParam(AdjustParam param)
{
model->insertRow(0);
model->setData(model->index(0, 0), QString("0x%1").arg(param.c50, 0, 16), Qt::DisplayRole);
model->setData(model->index(0, 1), QString("0x%1").arg(param.c51, 0, 16));
model->setData(model->index(0, 2), QString("0x%1").arg(param.c54, 0, 16));
model->setData(model->index(0, 3), param.power);
}
QMap<int, Dialog::AdjustParam> Dialog::findBestMatch(QList<AdjustParam> params)
{
QMap<int, Dialog::AdjustParam> result;
// init result
for (int power = 0; power <= 33; ++power)
{
// best match
auto bestMatch = params[0];
for (auto& param : params)
{
// 更接近
if (qAbs(param.power - power) <= qAbs(bestMatch.power - power))
{
bestMatch = param;
}
}
// get the best match
result.insert(power, bestMatch);
}
return result;
}
float Dialog::getPeakPower()
{
float power;
peak();
visa_get_peak_power(instr, 1, &power);
return power;
}
QList<Dialog::AdjustParam> Dialog::doAdjust()
{
// TODO: 根据不同的区域设置不同的频率
fm_set_fix_freq(handler, region_usa, 915000, 1);
// set c51 register
fm_reg_write(handler, 0, 0xc51, 0x810f);
// set anttena
fm_reg_write(handler, 1, 0x113, 0);
QThread::msleep(500);
auto progress = 0;
// record parameters
QList<AdjustParam> params;
auto c50_step = ui->spinBox_c50->value();
auto c54_step = ui->spinBox_c54->value();
auto c50_start = 0x6f81;
auto c50_end = 0x6fbf;
// auto c50_end = 0x6f83;
auto c54_start = 0x430;
auto c54_end = 0x43f;
auto n = 0, m = 0;
auto total = (c50_end - c50_start + 1) * (c54_end - c54_start + 1);
for (int c50_value = c50_start; c50_value <= c50_end; c50_value += c50_step, n++)
{
for (int c54_value = c54_start; c54_value <= c54_end; c54_value += c54_step, m++)
{
if (isStoped)
{
return params;
}
progress = c50_step * n + c54_step * m;
// 打开载波
fm_reg_write(handler, 1, 0xf000, 0x0017);
fm_reg_write(handler, 0, 0xc50, c50_value);
fm_reg_write(handler, 0, 0xc54, c54_value);
auto power = getPeakPower();
// TODO: record power value and c50 value and c54 value
// 关闭载波
fm_reg_write(handler, 1, 0xf000, 0x0018);
progress++;
emit progressChanged(progress * 100 / total);
updateAdjustMessage(QString("c50 %1 c54 %2 "
"power %3 <%4/%5>")
.arg(c50_value, 4, 16, QChar('0'))
.arg(c54_value, 4, 16, QChar('0'))
.arg(power)
.arg(progress)
.arg(total));
if (power >= 0)
{
auto param = AdjustParam{ progress - 1, c50_value, 0x810f, c54_value, power };
params.append(param);
emit newAdjustParam(param);
}
}
}
emit progressChanged(100);
updateAdjustMessage("准备写入oem寄存器......");
auto matches = findBestMatch(params);
QMapIterator<int, Dialog::AdjustParam> it(matches);
auto address = 0x1076;
while (it.hasNext())
{
it.next();
auto power = it.key();
auto param = it.value();
qDebug() << it.key() << ": <" << it.value().c50 << " " << it.value().c54 << " " << it.value().power << ">"
<< Qt::endl;
// write to oem register
fm_reg_write(handler, 2, address + power, param.c50);
fm_reg_write(handler, 2, address + power + 1, param.c51);
fm_reg_write(handler, 2, address + power + 2, param.c54);
address += 3;
updateAdjustMessage(QString("写入oem寄存器 power %1......").arg(power));
}
return params;
}
QList<Dialog::AdjustParam> Dialog::doAdjust2()
{
}
void Dialog::closeEvent(QCloseEvent* event)
{
isStoped = true;
QDialog::closeEvent(event);
}
void Dialog::open_cw()
{
write_host_reg(0xf000, 0x0017);
}
void Dialog::close_cw()
{
write_host_reg(0xf000, 0x0018);
}
void Dialog::disconnect_all()
{
visa_disconnect(rm, instr);
rm = -1;
instr = -1;
::disconnect(handler);
handler = -1;
emit connectStateChanged(false);
}
bool Dialog::connect_all()
{
updateAdjustMessage("开始连接频谱仪......");
// 1. 连接到频谱仪
int rm, instr;
auto ret = visa_connect((char*)ui->lineEdit_ip->text().toStdString().c_str(), &rm, &instr);
if (ret)
{
updateAdjustMessage("连接频谱仪失败......");
return false;
}
this->rm = rm;
this->instr = instr;
updateAdjustMessage(QString("连接频谱仪成功 %1 %2").arg(rm).arg(instr));
// 2. 连接到模块
updateAdjustMessage("开始连接到模块");
int handle;
ret = fm_connect_rs(
const_cast<char*>(ui->comboBox_port->currentText().toStdString().c_str()), 115200, -1, 3, _fm_vm_61fm, &handle);
if (ret != 0)
{
updateAdjustMessage("连接模块失败......");
return false;
}
this->handler = handle;
updateAdjustMessage("连接模块成功......");
emit connectStateChanged(true);
return true;
}
void Dialog::write_oem_reg(int address, int value)
{
fm_reg_write(handler, 2, address, value);
}
void Dialog::write_rfid_reg(int address, int value)
{
fm_reg_write(handler, 0, address, value);
}
void Dialog::write_host_reg(int address, int value)
{
fm_reg_write(handler, 1, address, value);
}
void Dialog::onConnectStateChanged(bool connected)
{
qDebug() << "connected:" << connected;
ui->test_data_container->setEnabled(connected);
ui->pushButton_test_connect->setEnabled(!connected);
ui->pushButton_test_disconnect->setEnabled(connected);
}
void Dialog::set_ant_power(int ant, int power)
{
set_power(handler, ant, power);
}
void Dialog::adjustFm()
{
updateAdjustMessage("开始连接频谱仪......");
// 1. 连接到频谱仪
int rm, instr;
auto ret = visa_connect((char*)ui->lineEdit_ip->text().toStdString().c_str(), &rm, &instr);
if (ret)
{
updateAdjustMessage("连接频谱仪失败......");
return;
}
defer1(visa_disconnect(rm, instr););
updateAdjustMessage(QString("连接频谱仪成功 %1 %2").arg(rm).arg(instr));
// 2. 连接到模块
updateAdjustMessage("开始连接到模块");
int handle;
ret = fm_connect_rs(
const_cast<char*>(ui->comboBox_port->currentText().toStdString().c_str()), 115200, -1, 3, _fm_vm_61fm, &handle);
if (ret != 0)
{
updateAdjustMessage("连接模块失败......");
return;
}
updateAdjustMessage("连接模块成功......");
defer2(::disconnect(handle););
// 3. 初始化频谱仪设置
initSpectrumAnalyzer();
// 4. 开始遍历所有参数
// 4.1 TODO 根据不同的区域设置不同的定频值
ret = fm_set_fix_freq(handle, region_usa, 900000, 1);
if (ret)
{
updateAdjustMessage("设置定频失败");
return;
}
auto cycleCount = ui->checkBox_dataCollect->isChecked() ? ui->spinBox_cycleCount->value() : 1;
QList<AdjustParam> params;
// 设置天线,使用RegWrite命令,写HOST寄存器,地址0x0113
for (int var = 0; var < cycleCount; ++var)
{
params.append(doAdjust());
}
if (ui->checkBox_dataCollect->isChecked())
{
QFile file("data.csv");
if (file.open(QFile::WriteOnly | QFile::Truncate))
{
QTextStream out(&file);
for (auto& p : params)
{
out << p.c50 << "," << p.c54 << "," << p.power << "\n";
}
}
}
}
void Dialog::updateAdjustMessage(QString mesage)
{
emit adjustMessageChanged(mesage);
}
void Dialog::on_pushButton_startAdjust_clicked()
{
emit adjustStarted();
isStoped = false;
adjustTimer->start(1000);
startTime = QTime::currentTime();
ui->listWidget_log->clear();
model->removeRows(0, model->rowCount());
QtConcurrent::run(
[&]
{
defer1(isStoped = true;);
adjustFm();
emit adjustEnd();
});
}
void Dialog::onAdjustMessageChanged(QString message)
{
ui->listWidget_log->addItem(message);
}
bool Dialog::eventFilter(QObject* watched, QEvent* event)
{
if (watched == ui->comboBox_port && event->type() == QEvent::HoverEnter)
{
updatePorts();
}
return QDialog::eventFilter(watched, event);
}
void Dialog::on_pushButton_endAdjust_clicked()
{
isStoped = true;
}
void Dialog::on_pushButton_test_connect_clicked()
{
if (connect_all())
{
initSpectrumAnalyzer();
}
}
void Dialog::on_pushButton_test_disconnect_clicked()
{
disconnect_all();
}
void Dialog::on_pushButton_test_get_all_rfid_reg_clicked()
{
int c50, c51, c54, c58;
fm_reg_read(handler, 0, 0xc50, &c50);
fm_reg_read(handler, 0, 0xc51, &c51);
fm_reg_read(handler, 0, 0xc54, &c54);
fm_reg_read(handler, 0, 0xc58, &c58);
ui->spinBox_test_c50->setValue(c50);
ui->spinBox_test_c51->setValue(c51);
ui->spinBox_test_c54->setValue(c54);
ui->spinBox_test_c58->setValue(c58);
}
void Dialog::on_pushButton_test_get_power_clicked()
{
int power;
get_power(handler, 1, &power);
ui->spinBox_test_power->setValue(power);
}
void Dialog::on_pushButton_test_set_power_clicked()
{
set_ant_power(1, ui->spinBox_test_power->value());
}
void Dialog::on_pushButton_test_open_cw_clicked()
{
open_cw();
}
void Dialog::on_pushButton_test_close_cw_clicked()
{
close_cw();
}
void Dialog::on_spinBox_test_c50_valueChanged(int arg1)
{
write_rfid_reg(0xc50, arg1);
}
void Dialog::on_spinBox_test_c54_valueChanged(int arg1)
{
write_rfid_reg(0xc54, arg1);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lgnhm/fm.git
git@gitee.com:lgnhm/fm.git
lgnhm
fm
fmTools
master

搜索帮助