Files
Radio/module/radio/BackEnd/RadioWidget.cpp
T
2026-07-23 18:11:07 +08:00

425 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "RadioWidget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QVector>
#include "../component/FrequentShower.h"
#include "../component/ProgressBar.h"
#include "../Global.h"
#include "../menu/BaseWidgetMenu.h"
#include "BackEnd.h"
#include "../BackEnd/MainWidget.h"
#include "YSGraphic_Core/DemoGallery/Tool.h"
static bool use_Performance_shower = false;
static double max = 160;
static YSG::Range frequent_range = {-12000, 12000};
QWidget* RadioWidget::createSpectrogramPowerPlot() {
class SpectrumPlot : public YSG::Plot {
public:
YSG::Frequent_Axis *xAxis{};
YSG::Axis *yAxis{};
YSG::Muti_Select_Rect* msr{};
YSG::Spectrum *sp{};
QMenu *mMenu{};
void init() override {
Plot::init();
object_name = "SpectrumPlot";
xAxis = YSG::Frequent_Axis::Builder(this, Qt::Horizontal)
.set_coord_range(frequent_range)
.set_tick_length(-10)
.build();
yAxis = YSG::Axis::Builder(this, Qt::Vertical)
.set_coord_range({max, 0})
.set_unit_text("功率")
.build();
sp = YSG::Spectrum::Builder(xAxis, yAxis)
.set_frequent_range(frequent_range)
.set_frequent_point_size(1024)
.build();
msr = YSG::Muti_Select_Rect::Builder(xAxis, yAxis).build();
if(use_Performance_shower) set_use_performance_shower(true);
}
protected:
void resizeEvent(QResizeEvent* event) override {
xAxis->set_x(0);
xAxis->set_y(height() - 1);
xAxis->set_pixel_size(width());
yAxis->set_x(0);
yAxis->set_y(0);
yAxis->set_pixel_size(height());
}
void contextMenuEvent(QContextMenuEvent* event) override {
if(!mMenu) {
auto ws =
bw(cw(sp, -1), "频谱图") +
bw(cw(xAxis), "频率x轴") +
bw(cw(yAxis), "功率y轴") +
bw(cw(msr), "多选框");
mMenu = createMenu(this, ws);
}
mMenu->exec(event->globalPos());
}
};
auto w = new SpectrumPlot;
w->init();
mSpectrogramLine = w->sp;
mProgressBar1->mSetValue = [this]() {
double middleFrequent = this->mSpectrogramLine->frequent_range().center();
bool ok;
this->mProgressBar1->mValue = mSpectrogramLine->get_power(middleFrequent, ok, YSG::SRC::Edit);
};
return w;
}
QWidget* RadioWidget::createWaterFallPlot() {
class WaterFallPlot : public YSG::Plot {
public:
YSG::Frequent_Axis *xAxis{};
YSG::Time_Axis *yAxis{};
YSG::Muti_Select_Rect *msr{};
YSG::Waterfall *wf{};
QMenu *mMenu{};
void init() override {
Plot::init();
object_name = "WaterFallPlot";
xAxis = YSG::Frequent_Axis::Builder(this, Qt::Horizontal)
.set_tick_length(-10)
.set_sub_tick_length(-5)
.set_coord_range(frequent_range)
.build();
yAxis = YSG::Time_Axis::Builder(this, Qt::Vertical)
.set_time_point_size(100)
.build();
wf = YSG::Waterfall::Builder(xAxis, yAxis)
.set_frequent_range(frequent_range)
.set_frequent_point_size(1024)
.set_power_range({0, max})
// .set_time_point_size(100)
.build();
msr = YSG::Muti_Select_Rect::Builder(xAxis, yAxis).build();
if(use_Performance_shower) set_use_performance_shower(true);
}
protected:
void resizeEvent(QResizeEvent* event) override {
xAxis->set_x(0);
xAxis->set_y(height());
xAxis->set_pixel_size(width());
yAxis->set_x(0);
yAxis->set_y(0);
yAxis->set_pixel_size(height());
}
void contextMenuEvent(QContextMenuEvent* event) override {
if(!mMenu) {
auto ws =
bw(cw(wf, -1), "瀑布图") +
bw(cw(xAxis), "频率轴") +
bw(cw(yAxis), "时间轴") +
bw(cw(msr), "多选框");
mMenu = createMenu(this, ws);
}
mMenu->exec(event->globalPos());
}
};
auto w = new WaterFallPlot;
w->init();
mWaterFall = w->wf;
return w;
}
QWidget* RadioWidget::createAudioSpectrogramPlot() {
class SpectrumPlot : public YSG::Plot {
public:
YSG::Frequent_Axis *xAxis{};
YSG::Axis *yAxis{};
YSG::Muti_Select_Rect* msr{};
YSG::Spectrum *sp{};
QMenu *mMenu{};
void init() override {
Plot::init();
object_name = "SpectrumPlot";
xAxis = YSG::Frequent_Axis::Builder(this, Qt::Horizontal)
.set_coord_range({-12000 ,12000})
.set_tick_length(-10)
.set_sub_tick_length(-5)
.build();
yAxis = YSG::Axis::Builder(this, Qt::Vertical)
.set_coord_range({12000, -12000})
.set_unit_text("功率").build();
sp = YSG::Spectrum::Builder(xAxis, yAxis)
.set_frequent_range({-12000 ,12000})
.set_frequent_point_size(512)
.build();
msr = YSG::Muti_Select_Rect::Builder(xAxis, yAxis).build();
if(use_Performance_shower) set_use_performance_shower(true);
}
protected:
void resizeEvent(QResizeEvent* event) override {
xAxis->set_x(0);
xAxis->set_y(height() - 1);
xAxis->set_pixel_size(width());
yAxis->set_x(0);
yAxis->set_y(0);
yAxis->set_pixel_size(height());
}
void contextMenuEvent(QContextMenuEvent* event) override {
if(!mMenu) {
auto ws =
bw(cw(sp, -1), "频谱图") +
bw(cw(xAxis), "频率x轴") +
bw(cw(yAxis), "功率y轴") +
bw(cw(msr), "多选框");
mMenu = createMenu(this, ws);
}
mMenu->exec(event->globalPos());
}
};
auto w = new SpectrumPlot;
w->init();
mAudioSpectrogramPlot = w->sp;
return w;
}
QWidget* RadioWidget::createTimePowerPlot() {
class AudioPlot : public YSG::Plot {
public:
YSG::Time_Axis *xAxis{};
YSG::Axis *yAxis{};
YSG::Audio_Frequent *audio{};
YSG::Muti_Select_Rect* msr{};
QMenu *mMenu{};
void init() override {
Plot::init();
object_name = "AudioPlot";
xAxis = YSG::Time_Axis::Builder(this, Qt::Horizontal)
.set_tick_length(-10)
.set_sub_tick_length(-5)
.build();
yAxis = YSG::Axis::Builder(this, Qt::Vertical)
.set_coord_range({12000, -12000})
.build();
audio = YSG::Audio_Frequent::Builder(xAxis, yAxis)
.build();
msr = YSG::Muti_Select_Rect::Builder(xAxis, yAxis).build();
if(use_Performance_shower) set_use_performance_shower(true);
}
protected:
void resizeEvent(QResizeEvent* event) override {
xAxis->set_x(0);
xAxis->set_y(height() - 1);
xAxis->set_pixel_size(width());
yAxis->set_x(0);
yAxis->set_y(0);
yAxis->set_pixel_size(height());
audio->set_time_point_size(xAxis->get_pixel_point_size());
}
void contextMenuEvent(QContextMenuEvent* event) override {
if(!mMenu) {
auto ws =
bw( cw(audio, -1), "音频图") +
bw(cw(yAxis),"功率y轴") +
bw(cw(xAxis), "时间轴") +
bw(cw(msr), "多选框");
mMenu = createMenu(this, ws);
}
mMenu->exec(event->globalPos());
}
};
auto w = new AudioPlot;
w->init();
mTimePower = w->audio;
return w;
}
//mAM, mATU, mVSQL, mNB, mNR, mDNF, mPRE, mATT, mSPL, mFIL1, mAGC_A
RadioWidget::RadioWidget(QWidget *parent) : BaseWidget(parent) {
setObjectName("电台界面");
mVoiceValue = BackEnd::instance()->YsGetAfGain();
mRFGainValue = BackEnd::instance()->YsGetRfGain();
int fontSize = 20;
m1 = createNormal("RF Gain\n" + QString::number(mRFGainValue), fontSize);
m2 = createNormal("FFT SPAN\n100K", fontSize);
m3 = createNormal("频率表\n1289.6MHZ", fontSize);
m4 = createNormal("MODEM\nRTTY", fontSize);
m5 = createNormal("FIL1\n20K", fontSize);
m6 = createNormal("MSG1\n", fontSize);
mSelectValueWidget = new FrequentShower(this);
int n = 5;
QVector<double> tickList(n);
double space = 100.0/n;
for(int i = 0; i < n; ++i){
tickList[i] = i * space;
}
QColor orange(255, 165, 0);
mProgressBar1 = new ProgressBar({
Tick("S", Qt::black),
{"3", Qt::black},
{"6", Qt::black},
{"9", Qt::black},
{"20", Qt::black},
{"40", orange},
{"60", orange},
{"100", orange},
{"+160", Qt::red},
}, this);
mProgressBar2 = new ProgressBar({
{"1", Qt::black},
{"2", Qt::yellow},
{"3", Qt::red},
{">5", Qt::red},
}, this);
mProgressBar1->mTickSpaceW = 2.0f;
auto main = createVBoxLayout({}, this);
main->addStretch(1);
{ // 中心Layout
auto center = createHBoxLayout();
main->addLayout(center, 7);
auto front = createVBoxLayout();
center->addLayout(front, 1);
front->addWidget(m1, 3);
front->addStretch(1);
front->addWidget(m2, 3);
center->addSpacing(4);
auto middle = createVBoxLayout();
center->addLayout(middle, 9);
middle->addStretch(1);
middle->addWidget(mSelectValueWidget, 4);
auto middleH = createHBoxLayout();
middle->addLayout(middleH, 2);
middleH->addWidget(mProgressBar1, 5);
middleH->addStretch(1);
middleH->addWidget(mProgressBar2, 3);
center->addStretch(4);
auto back1 = createVBoxLayout();
center->addLayout(back1, 1);
back1->addWidget(m3, 3);
back1->addStretch(1);
back1->addWidget(m4, 3);
center->addSpacing(4);
auto back2 = createVBoxLayout();
center->addLayout(back2, 1);
back2->addWidget(m5, 3);
back2->addStretch(1);
back2->addWidget(m6, 3);
}
main->addStretch(1);
auto aH1 = createHBoxLayout();
aH1->setSpacing(8);
main->addLayout(aH1, 12);
aH1->addWidget(createSpectrogramPowerPlot(), 12);
aH1->addWidget(createTimePowerPlot(), 4);
main->addSpacing(8);
auto aH2 = createHBoxLayout();
aH2->setSpacing(8);
main->addLayout(aH2, 12);
aH2->addWidget(createWaterFallPlot(), 12);
aH2->addWidget(createAudioSpectrogramPlot(), 4);
initMenu();
}
RadioWidget::~RadioWidget() {
}
void RadioWidget::initMenu() {
int fontSize = 30;
auto btn1_1 = new MenuButton("模式设置", fontSize, [](){});
auto btn1_2 = new ValueMenuButton("发射功率:%1 W", fontSize, [&](ValueMenuButton* that, bool add){
that->setValue(that->mValue + (double)(add?1:-1));
}, -1);
auto btn2_1 = new ValueMenuButton("参考增益:%1", fontSize, [&](ValueMenuButton* that, bool add){
that->setValue(that->mValue + (double)(add?1:-1));
}, -1);
mBaseWidgetMenu->addMenuButtonOnLayout1({btn1_1, btn1_2, {btn2_1},});
//mBaseWidgetMenu->addMenuButtonOnLayout2( );
BaseWidgetMenu* sub1 = mBaseWidgetMenu->createSubWidgetMenu(btn1_1);
auto s1_1 = new MenuButton("AM", fontSize, [](){
});
auto s1_2 = new MenuButton("FM", fontSize, [](){
});
auto s1_3 = new MenuButton("SSB", fontSize, [](){
});
auto s1_4 = new MenuButton("CW", fontSize, [](){
});
sub1->addMenuButtonOnLayout1({s1_1, s1_2, s1_3, s1_4}, 1);
}
void RadioWidget::focusInEvent(QFocusEvent *event) {
QWidget::focusInEvent(event);
mSelectValueWidget->setFocus();
}
void RadioWidget::keyPressEvent(QKeyEvent *event) {
if (event->type() == QEvent::KeyPress) {
BackEnd* g = BackEnd::instance();
auto *keyEvent = dynamic_cast<QKeyEvent *>(event);
if(g->match(keyEvent, "切换音量/RF Gain")){
if(m1->text().startsWith("RF Gain")){
m1->setText("Voice\n" + QString::number(mVoiceValue));
} else {
m1->setText("RF Gain\n" + QString::number(mRFGainValue));
}
}
if(g->match(keyEvent, "特别增加")){
if(m1->text().startsWith("RF Gain")){
mRFGainValue++;
BackEnd::instance()->YsSetRfGain(mRFGainValue);
m1->setText("RF Gain\n" + QString::number(mRFGainValue));
} else {
mVoiceValue++;
BackEnd::instance()->YsSetAfGain(mVoiceValue);
m1->setText("Voice\n" + QString::number(mVoiceValue));
}
}
if(g->match(keyEvent, "特别减小")){
if(m1->text().startsWith("RF Gain")){
mRFGainValue--;
BackEnd::instance()->YsSetRfGain(mRFGainValue);
m1->setText("RF Gain\n" + QString::number(mRFGainValue));
} else {
mVoiceValue--;
BackEnd::instance()->YsSetAfGain(mVoiceValue);
m1->setText("Voice\n" + QString::number(mVoiceValue));
}
}
}
BaseWidget::keyPressEvent(event);
}