diff --git a/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp b/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp index ca100fe46..0ca5b1bb9 100644 --- a/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp +++ b/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp @@ -22,9 +22,9 @@ #include "opentx.h" extern uint8_t g_moduleIdx; +#define SET_DIRTY() storageDirty(EE_GENERAL) #define SPECTRUM_HEIGHT 200 - coord_t getAverage(uint8_t number, const uint8_t * value) { uint16_t sum = 0; @@ -34,6 +34,51 @@ coord_t getAverage(uint8_t number, const uint8_t * value) return sum / number; } +class SpectrumFooterWindow : public FormWindow +{ + public: + SpectrumFooterWindow(Window *parent, const rect_t &rect) : + FormWindow(parent, rect, NO_SCROLLBAR) + { + } + + void paint(BitmapBuffer * dc) override + { + FormGridLayout grid; + grid.spacer(PAGE_PADDING); + grid.setLabelWidth(0); + + dc->drawSolidFilledRect(0, 0, width(), height(), CURVE_AXIS_COLOR); + if (isModuleMultimodule(g_moduleIdx)) { + // Frequency + auto freq = new NumberEdit(this, grid.getFieldSlot(3, 0), reusableBuffer.spectrumAnalyser.freqMin, + reusableBuffer.spectrumAnalyser.freqMax, + GET_DEFAULT(reusableBuffer.spectrumAnalyser.freq / 1000000), + SET_VALUE(reusableBuffer.spectrumAnalyser.freq, newValue * 1000000), + MENU_COLOR); + freq->setSuffix("MHz"); + freq->setPrefix("F:"); + + // Span + auto span = new NumberEdit(this, grid.getFieldSlot(3, 1), 1, reusableBuffer.spectrumAnalyser.spanMax, + GET_DEFAULT(reusableBuffer.spectrumAnalyser.span / 1000000), + SET_VALUE(reusableBuffer.spectrumAnalyser.span, newValue * 1000000), + MENU_COLOR); + span->setSuffix("MHz"); + span->setPrefix("S:"); + + // Tracker + auto tracker = new NumberEdit(this, grid.getFieldSlot(3,2), (reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2) / 1000000, + (reusableBuffer.spectrumAnalyser.freq + reusableBuffer.spectrumAnalyser.span / 2) / 1000000, + GET_DEFAULT(reusableBuffer.spectrumAnalyser.track / 1000000), + SET_VALUE(reusableBuffer.spectrumAnalyser.track, newValue * 1000000), + MENU_COLOR); + tracker->setSuffix("MHz"); + tracker->setPrefix("T:"); + tracker->setFocus(); + } + } +}; class SpectrumWindow : public Window { @@ -109,6 +154,11 @@ class SpectrumWindow : public Window } } } + + // Draw tracker + int offset = reusableBuffer.spectrumAnalyser.track - (reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2); + int x = limit(0, offset / reusableBuffer.spectrumAnalyser.step, width() - 1); + dc->drawSolidVerticalLine(x, 0, height(), BLACK); } protected: @@ -120,13 +170,14 @@ RadioSpectrumAnalyser::RadioSpectrumAnalyser(uint8_t moduleIdx) : moduleIdx(moduleIdx) { buildBody(&body); - setFocus(); start(); } void RadioSpectrumAnalyser::buildBody(FormWindow * window) { new SpectrumWindow(window, {0, 0, LCD_W, SPECTRUM_HEIGHT}); + auto footer = new SpectrumFooterWindow(window, {0, SPECTRUM_HEIGHT, LCD_W, LCD_H - SPECTRUM_HEIGHT}); + footer->setFocus(); } void RadioSpectrumAnalyser::start() @@ -168,7 +219,14 @@ void RadioSpectrumAnalyser::start() void RadioSpectrumAnalyser::stop() { new MessageDialog(STR_MODULE, STR_STOPPING); - moduleState[moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); + if (isModulePXX2(g_moduleIdx)) + moduleState[moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); + else if (isModuleMultimodule(g_moduleIdx)) { + if (reusableBuffer.spectrumAnalyser.moduleOFF) + setModuleType(INTERNAL_MODULE, MODULE_TYPE_NONE); + else + moduleState[g_moduleIdx].mode = MODULE_MODE_NORMAL; + } /* wait 1s to resume normal operation before leaving */ // watchdogSuspend(1000); // RTOS_WAIT_MS(1000);