首次提交
This commit is contained in:
@@ -0,0 +1,428 @@
|
||||
#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::FrequentAxis *xAxis{};
|
||||
YSG::Axis *yAxis{};
|
||||
YSG::MutiSelectRect* msr{};
|
||||
YSG::Spectrum *sp{};
|
||||
QMenu *mMenu{};
|
||||
void init() override {
|
||||
Plot::init();
|
||||
mObjectName = "SpectrumPlot";
|
||||
bindRenderThread(mObjectName + "Thread");
|
||||
|
||||
|
||||
xAxis = YSG::FrequentAxis::Builder(this, Qt::Horizontal)
|
||||
.set_coordRange(frequent_range)
|
||||
.set_tickLength(-10)
|
||||
.build();
|
||||
|
||||
|
||||
yAxis = YSG::Axis::Builder(this, Qt::Vertical)
|
||||
.set_coordRange({max, 0})
|
||||
.set_unitText("功率")
|
||||
.build();
|
||||
|
||||
sp = YSG::Spectrum::Builder(xAxis, yAxis)
|
||||
.set_frequentRange(frequent_range)
|
||||
.set_frequentPointSize(1024)
|
||||
.build();
|
||||
msr = YSG::MutiSelectRect::Builder(xAxis, yAxis).build();
|
||||
if(use_Performance_shower) set_usePerformanceShower(true);
|
||||
}
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent* event) override {
|
||||
xAxis->set_x(0);
|
||||
xAxis->set_y(height() - 1);
|
||||
xAxis->set_pixelSize(width());
|
||||
yAxis->set_x(0);
|
||||
yAxis->set_y(0);
|
||||
yAxis->set_pixelSize(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->frequentRange().center();
|
||||
bool ok;
|
||||
this->mProgressBar1->mValue = mSpectrogramLine->getPower(middleFrequent, ok, YSG::SRC::Cache);
|
||||
};
|
||||
return w;
|
||||
}
|
||||
|
||||
|
||||
QWidget* RadioWidget::createWaterFallPlot() {
|
||||
class WaterFallPlot : public YSG::Plot {
|
||||
public:
|
||||
YSG::FrequentAxis *xAxis{};
|
||||
YSG::TimeAxis *yAxis{};
|
||||
YSG::MutiSelectRect *msr{};
|
||||
YSG::WaterFall *wf{};
|
||||
QMenu *mMenu{};
|
||||
void init() override {
|
||||
Plot::init();
|
||||
mObjectName = "WaterFallPlot";
|
||||
bindRenderThread(mObjectName + "Thread");
|
||||
xAxis = YSG::FrequentAxis::Builder(this, Qt::Horizontal)
|
||||
.set_tickLength(-10)
|
||||
.set_subTickLength(-5)
|
||||
.set_coordRange(frequent_range)
|
||||
.build();
|
||||
yAxis = YSG::TimeAxis::Builder(this, Qt::Vertical)
|
||||
.set_timePointSize(100)
|
||||
.build();
|
||||
wf = YSG::WaterFall::Builder(xAxis, yAxis)
|
||||
.set_frequentRange(frequent_range)
|
||||
.set_frequentPointSize(1024)
|
||||
.set_powerRange({0, max})
|
||||
// .set_timePointSize(100)
|
||||
.build();
|
||||
msr = YSG::MutiSelectRect::Builder(xAxis, yAxis).build();
|
||||
if(use_Performance_shower) set_usePerformanceShower(true);
|
||||
}
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent* event) override {
|
||||
xAxis->set_x(0);
|
||||
xAxis->set_y(height());
|
||||
xAxis->set_pixelSize(width());
|
||||
yAxis->set_x(0);
|
||||
yAxis->set_y(0);
|
||||
yAxis->set_pixelSize(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::FrequentAxis *xAxis{};
|
||||
YSG::Axis *yAxis{};
|
||||
YSG::MutiSelectRect* msr{};
|
||||
YSG::Spectrum *sp{};
|
||||
QMenu *mMenu{};
|
||||
void init() override {
|
||||
Plot::init();
|
||||
mObjectName = "SpectrumPlot";
|
||||
bindRenderThread(mObjectName + "Thread");
|
||||
|
||||
|
||||
xAxis = YSG::FrequentAxis::Builder(this, Qt::Horizontal)
|
||||
.set_coordRange({-12000 ,12000})
|
||||
.set_tickLength(-10)
|
||||
.set_subTickLength(-5)
|
||||
.build();
|
||||
|
||||
|
||||
yAxis = YSG::Axis::Builder(this, Qt::Vertical)
|
||||
.set_coordRange({12000, -12000})
|
||||
.set_unitText("功率").build();
|
||||
|
||||
|
||||
sp = YSG::Spectrum::Builder(xAxis, yAxis)
|
||||
.set_frequentRange({-12000 ,12000})
|
||||
.set_frequentPointSize(512)
|
||||
.build();
|
||||
|
||||
msr = YSG::MutiSelectRect::Builder(xAxis, yAxis).build();
|
||||
|
||||
if(use_Performance_shower) set_usePerformanceShower(true);
|
||||
}
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent* event) override {
|
||||
xAxis->set_x(0);
|
||||
xAxis->set_y(height() - 1);
|
||||
xAxis->set_pixelSize(width());
|
||||
yAxis->set_x(0);
|
||||
yAxis->set_y(0);
|
||||
yAxis->set_pixelSize(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::TimeAxis *xAxis{};
|
||||
YSG::Axis *yAxis{};
|
||||
YSG::AudioFrequent *audio{};
|
||||
YSG::MutiSelectRect* msr{};
|
||||
QMenu *mMenu{};
|
||||
void init() override {
|
||||
Plot::init();
|
||||
mObjectName = "AudioPlot";
|
||||
bindRenderThread(mObjectName + "Thread");
|
||||
|
||||
xAxis = YSG::TimeAxis::Builder(this, Qt::Horizontal)
|
||||
.set_tickLength(-10)
|
||||
.set_subTickLength(-5)
|
||||
.build();
|
||||
|
||||
yAxis = YSG::Axis::Builder(this, Qt::Vertical)
|
||||
.set_coordRange({12000, -12000})
|
||||
.build();
|
||||
|
||||
|
||||
audio = YSG::AudioFrequent::Builder(xAxis, yAxis)
|
||||
.build();
|
||||
msr = YSG::MutiSelectRect::Builder(xAxis, yAxis).build();
|
||||
|
||||
|
||||
if(use_Performance_shower) set_usePerformanceShower(true);
|
||||
}
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent* event) override {
|
||||
xAxis->set_x(0);
|
||||
xAxis->set_y(height() - 1);
|
||||
xAxis->set_pixelSize(width());
|
||||
yAxis->set_x(0);
|
||||
yAxis->set_y(0);
|
||||
yAxis->set_pixelSize(height());
|
||||
audio->set_timePointSize(xAxis->getPixelPointSize());
|
||||
}
|
||||
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("频率表\n(12)89.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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user