#include "RadioWidget.h" #include #include #include #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"; 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::Edit); }; 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"; 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"; 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"; 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 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(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); }