#include "IntermediateFrequencyWidget.h" #include #include #include #include #include #include "../component/FrequentShower.h" #include "../component/ProgressBar.h" #include "../component/ConsoleWidget.h" #include "../component/ShowTime.h" #include "../Global.h" #include "../BaseWidget.h" #include "../menu/BaseWidgetMenu.h" #include "../BackEnd/MainWidget.h" #include "YSGraphic_Core/DemoGallery/Tool.h" static YSG::Range frequent_range = {-12000, 12000}; static double max = 160; QWidget* IntermediateFrequencyWidget::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_tickLength(-10) .set_coordRange(frequent_range) .set_tickLength(-10) .set_subTickLength(-5) .build(); yAxis = YSG::Axis::Builder(this, Qt::Vertical) .set_coordRange({160, 0}) .set_unitText("功率") .build(); sp = YSG::Spectrum::Builder(xAxis, yAxis) .set_frequentRange(frequent_range) .set_useSweepFrequentRect(true) .set_frequentPointSize(1024) .build(); msr = YSG::MutiSelectRect::Builder(xAxis, yAxis).build(); } 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* IntermediateFrequencyWidget::create_Afterglow_Plot(){ class AfterglowPlot : public YSG::Plot { public: YSG::FrequentAxis *xAxis{}; YSG::Axis *yAxis{}; YSG::Afterglow *ag{}; YSG::MutiSelectRect* msr{}; QMenu *mMenu{}; void init() override { Plot::init(); mObjectName = "AfterglowPlot"; xAxis = YSG::FrequentAxis::Builder(this, Qt::Horizontal) .set_coordRange(frequent_range) .set_tickLength(-10) .set_subTickLength(-5) .set_use_drag(true) .build(); yAxis = YSG::Axis::Builder(this, Qt::Vertical) .set_coordRange({160, 0}) .set_use_drag(true) .build(); ag = YSG::Afterglow::Builder(xAxis, yAxis) .set_frequentRange(frequent_range) .set_powerRange({0 , 160}) .set_frequentPointSize(1024) .build(); msr = YSG::MutiSelectRect::Builder(xAxis, yAxis).build(); } 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()); ag->set_powerPointSize(ag->powerAxis()->getPixelPointSize()); } void contextMenuEvent(QContextMenuEvent* event) override { if(!mMenu) { auto ws = bw(cw(ag, -1), "余辉图") + bw(cw(xAxis), "频率轴") + bw(cw(yAxis),"功率概率轴") + bw(cw(msr), "多选框"); mMenu = createMenu(this, ws); } mMenu->exec(event->globalPos()); } }; auto w = new AfterglowPlot; w->init(); mAfterglow = w->ag; return w; } //mAM, mATU, mVSQL, mNB, mNR, mDNF, mPRE, mATT, mSPL, mFIL1, mAGC_A IntermediateFrequencyWidget::IntermediateFrequencyWidget(QWidget *parent) : BaseWidget(parent) { setObjectName("发射界面"); int fontSize = 20; m1 = createNormal("RF Gain\n62", 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); mFrequentShower = new FrequentShower(this); 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}, {"+80", orange}, {"+100", Qt::red}, }, this); mProgressBar2 = new ProgressBar({ {"1", Qt::black}, {"2", Qt::yellow}, {"3", Qt::red}, {">5", Qt::red}, }, this); auto main = createVBoxLayout({}, this); main->addStretch(1); { 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(mFrequentShower, 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); main->addSpacing(8); auto aH = createHBoxLayout(); main->addLayout(aH, 12); aH->addWidget(createSpectrogramPowerPlot(), 12); aH->addSpacing(8); main->addWidget(create_Afterglow_Plot(), 12); initMenu(); } IntermediateFrequencyWidget::~IntermediateFrequencyWidget() { } void IntermediateFrequencyWidget::focusInEvent(QFocusEvent *event) { QWidget::focusInEvent(event); mFrequentShower->setFocus(); } void IntermediateFrequencyWidget::initMenu() { int fontSize = 30; auto btn1 = new DoubleTextMenuButton("设置最大值标记", "取消最大值标记", fontSize, [&](bool isFirst){ mSpectrogramLine->set_useMaxMarker(isFirst); mBaseWidgetMenu->hide(); MainWidget::instance()->getCurrentBaseWidget()->setFocus(); }); auto btn2 = new DoubleTextMenuButton("设置最小值标记", "取消最小值标记", fontSize, [&](bool isFirst){ mSpectrogramLine->set_useMinMarker(isFirst); mBaseWidgetMenu->hide(); MainWidget::instance()->getCurrentBaseWidget()->setFocus(); }); auto btn3 = new MenuButton("设置自定义标记", fontSize, [&](){ mBaseWidgetMenu->hide(); MainWidget::instance()->getCurrentBaseWidget()->setFocus(); }); auto frequentStep2 = new ValueMenuButton("频率步进:%1", fontSize, [this](ValueMenuButton* that, bool add){ int newFrequent = (int)that->mValue + (add?1:-1); that->setValue(newFrequent); mSpectrogramLine->setCurrentMarkerFrequent(newFrequent); }, qMax(0.0, mSpectrogramLine->frequentRange().length()/50.0)); auto btn_middleFrequent = new ValueMenuButton("中频:%1 Hz", fontSize, nullptr, mSpectrogramLine->middleSweepFrequent()); auto btn_frequentWidth = new ValueMenuButton("频宽:%1 Hz", fontSize, [this, frequentStep2](ValueMenuButton* that, bool add){ that->setValue(that->mValue + (double)(add?frequentStep2->mValue:-frequentStep2->mValue)); double middleSweepFrequent = mSpectrogramLine->middleSweepFrequent(); mSpectrogramLine->set_sweepFrequentRange({middleSweepFrequent - that->mValue, middleSweepFrequent + that->mValue}); }, qAbs(mSpectrogramLine->sweepFrequentRange().length()/2)); btn_middleFrequent->mValueChanged = [this, btn_frequentWidth, frequentStep2](ValueMenuButton* that, bool add){ that->setValue(that->mValue + (double)(add?frequentStep2->mValue:-frequentStep2->mValue)); mSpectrogramLine->set_middleSweepFrequent(that->mValue); mSpectrogramLine->set_sweepFrequentRange({that->mValue - btn_frequentWidth->mValue, that->mValue + btn_frequentWidth->mValue}); }; auto btn2_2 = new ValueMenuButton("参考增益:%1", fontSize, [&](ValueMenuButton* that, bool add){ that->setValue(that->mValue + (double)(add ? 1 : -1)); }, 0); mBaseWidgetMenu->addMenuButtonOnLayout1({btn1, btn2, btn3, btn2_2, }); mBaseWidgetMenu->addMenuButtonOnLayout2({frequentStep2, btn_middleFrequent, btn_frequentWidth,}); BaseWidgetMenu* sub1 = mBaseWidgetMenu->createSubWidgetMenu(btn3); auto frequentStep = new ValueMenuButton("频率步进:%1", fontSize, [this](ValueMenuButton* that, bool add){ int newFrequent = (int)that->mValue + (add?1:-1); that->setValue(newFrequent); mSpectrogramLine->setCurrentMarkerFrequent(newFrequent); }, qMax(0.0, mSpectrogramLine->frequentRange().length()/50.0)); auto markFrequent = new ValueMenuButton("更改标记频率:%1", fontSize, [frequentStep, this](ValueMenuButton* that, bool add){ int newFrequent = (int)that->mValue + (add?frequentStep->mValue:-frequentStep->mValue); that->setValue(newFrequent); mSpectrogramLine->setCurrentMarkerFrequent(newFrequent); }, -1); auto addInitFrequent = new ValueMenuButton("添加初始频率:%1", fontSize, [frequentStep,this](ValueMenuButton* that, bool add){ int newFrequent = (int)that->mValue + (add?frequentStep->mValue:-frequentStep->mValue); that->setValue(newFrequent); }, mSpectrogramLine->frequentRange().lower); auto btn1_1 = new ValueMenuButton("当前标记:%1", fontSize, [&, markFrequent](ValueMenuButton* that, bool add){ int index = ((int)that->mValue + (add?1:-1) ) % mSpectrogramLine->selectLineMarkerSize(); that->setValue(index); mSpectrogramLine->setSelectedLineMarker(index); markFrequent->setValue(mSpectrogramLine->getMarkFrequent(index)); }, -1); auto btn1_2 = new MenuButton("添加标记", fontSize, [&, addInitFrequent](){ mSpectrogramLine->addCustomLineMarker(addInitFrequent->mValue); }); auto btn1_3 = new MenuButton("删除标记", fontSize, [&](){ mSpectrogramLine->removeCurrentMarker(); int size = mSpectrogramLine->selectLineMarkerSize(); if(size == 0){ mSpectrogramLine->setSelectedLineMarker(-1); } else { mSpectrogramLine->setSelectedLineMarker(0); } }); connect(sub1, &BaseWidgetMenu::showThat, [&, markFrequent](){ mSpectrogramLine->setSelectedLineMarker(0); markFrequent->setValue(mSpectrogramLine->getMarkFrequent(0)); }); connect(sub1, &BaseWidgetMenu::hideThat, [&](){ mSpectrogramLine->unSelectMarker(); }); sub1->addMenuButtonOnLayout1({btn1_1, btn1_2, btn1_3},2); sub1->addMenuButtonOnLayout2({frequentStep, markFrequent, addInitFrequent}, 2); }