From 775ac40aaa6f4314b48d149cccfab3e24f6fc267 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 20 Mar 2019 08:46:47 +0100 Subject: [PATCH] Powermeter added --- radio/src/gui/128x64/menus.h | 3 +- radio/src/gui/212x64/menu_radio.cpp | 1 + radio/src/gui/212x64/menus.h | 4 ++ radio/src/gui/common/stdlcd/CMakeLists.txt | 3 + .../gui/common/stdlcd/radio_power_meter.cpp | 64 +++++++++++++++++++ .../stdlcd/radio_spectrum_analyser.cpp} | 12 ++-- .../{128x64 => common/stdlcd}/radio_tools.cpp | 6 +- radio/src/opentx.h | 13 +++- radio/src/pulses/pulses.h | 10 +-- radio/src/pulses/pxx2.cpp | 31 +++++++-- radio/src/pulses/pxx2.h | 2 + radio/src/targets/taranis/CMakeLists.txt | 10 --- radio/src/telemetry/frsky_pxx2.cpp | 28 +++++--- 13 files changed, 143 insertions(+), 44 deletions(-) create mode 100644 radio/src/gui/common/stdlcd/radio_power_meter.cpp rename radio/src/gui/{128x64/radio_spectrum.cpp => common/stdlcd/radio_spectrum_analyser.cpp} (80%) rename radio/src/gui/{128x64 => common/stdlcd}/radio_tools.cpp (89%) diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 3c3308b06..b8890dc0d 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -99,7 +99,8 @@ void menuRadioDiagKeys(event_t event); void menuRadioDiagAnalogs(event_t event); void menuRadioHardware(event_t event); void menuRadioTools(event_t event); -void menuRadioSpectrum(event_t event); +void menuRadioSpectrumAnalyser(event_t event); +void menuRadioPowerMeter(event_t event); void menuRadioCalibration(event_t event); static const MenuHandlerFunc menuTabGeneral[] = { diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index e0452d8ec..c03ce1851 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -23,6 +23,7 @@ const MenuHandlerFunc menuTabGeneral[] = { menuRadioSetup, menuRadioSdManager, + menuRadioTools, menuRadioSpecialFunctions, menuRadioTrainer, menuRadioVersion, diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index e47fcd04b..3acaf25c3 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -73,6 +73,7 @@ void menuTraceBuffer(event_t event); enum MenuRadioIndexes { MENU_RADIO_SETUP, MENU_RADIO_SD_MANAGER, + MENU_RADIO_TOOLS, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_VERSION, @@ -88,7 +89,10 @@ void menuRadioVersion(event_t event); void menuRadioDiagKeys(event_t event); void menuRadioDiagAnalogs(event_t event); void menuRadioHardware(event_t event); +void menuRadioTools(event_t event); void menuRadioCalibration(event_t event); +void menuRadioSpectrumAnalyser(event_t event); +void menuRadioPowerMeter(event_t event); extern const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT]; diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index a9056719f..fec9462fd 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -28,5 +28,8 @@ if(SDCARD) set(GUI_SRC ${GUI_SRC} ../common/stdlcd/radio_sdmanager.cpp + ../common/stdlcd/radio_tools.cpp + ../common/stdlcd/radio_spectrum_analyser.cpp + ../common/stdlcd/radio_power_meter.cpp ) endif() diff --git a/radio/src/gui/common/stdlcd/radio_power_meter.cpp b/radio/src/gui/common/stdlcd/radio_power_meter.cpp new file mode 100644 index 000000000..edc7e2474 --- /dev/null +++ b/radio/src/gui/common/stdlcd/radio_power_meter.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include "opentx.h" + +void menuRadioPowerMeter(event_t event) +{ + SIMPLE_SUBMENU("POWER METER", 1); + + if (menuEvent) { + INTERNAL_MODULE_OFF(); + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + /* wait 500ms off */ + watchdogSuspend(500); + RTOS_WAIT_MS(500); + INTERNAL_MODULE_ON(); + } + else if (event == EVT_ENTRY) { + memclear(&reusableBuffer.powerMeter, sizeof(reusableBuffer.powerMeter)); + reusableBuffer.powerMeter.freq = 2400; + moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_POWER_METER; + } + + coord_t y = MENU_HEADER_HEIGHT + 1 + FH; + LcdFlags attr = (menuVerticalPosition - HEADER_LINE == 0 ? INVERS : 0); + lcdDrawText(0, y, "Freq."); + lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.freq, LEFT|attr|(s_editMode > 0 ? BLINK : 0)); + lcdDrawText(lcdNextPos, y, "MHz"); + if (attr) { + CHECK_INCDEC_MODELVAR(event, reusableBuffer.powerMeter.freq, 2300, 2500); + if (checkIncDec_Ret) { + reusableBuffer.powerMeter.power = 0; + reusableBuffer.powerMeter.peak = 0; + } + } + + y += FH + 1; + lcdDrawText(0, y, "Power"); + lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.power, LEFT); + lcdDrawText(lcdNextPos, y, "dBm"); + + y += FH + 1; + lcdDrawText(0, y, "Peak"); + lcdDrawNumber(8*FW, y, reusableBuffer.powerMeter.peak, LEFT); + lcdDrawText(lcdNextPos, y, "dBm"); +} diff --git a/radio/src/gui/128x64/radio_spectrum.cpp b/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp similarity index 80% rename from radio/src/gui/128x64/radio_spectrum.cpp rename to radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp index 2fab450da..258b3a067 100644 --- a/radio/src/gui/128x64/radio_spectrum.cpp +++ b/radio/src/gui/common/stdlcd/radio_spectrum_analyser.cpp @@ -20,7 +20,7 @@ #include "opentx.h" -void menuRadioSpectrum(event_t event) +void menuRadioSpectrumAnalyser(event_t event) { SIMPLE_SUBMENU("SPECTRUM ANALYSER", 1); @@ -33,14 +33,14 @@ void menuRadioSpectrum(event_t event) INTERNAL_MODULE_ON(); } else if (event == EVT_ENTRY) { - memclear(reusableBuffer.spectrum.bars, sizeof(reusableBuffer.spectrum.bars)); + memclear(reusableBuffer.spectrumAnalyser.bars, sizeof(reusableBuffer.spectrumAnalyser.bars)); moduleSettings[INTERNAL_MODULE].mode = MODULE_MODE_SPECTRUM_ANALYSER; } uint8_t peak_y = 1; uint8_t peak_x = 0; for (uint8_t i=0; i(reusableBuffer.spectrum.bars[i] >> 1, 128); + uint8_t h = min(reusableBuffer.spectrumAnalyser.bars[i] >> 1, 128); if (h > peak_y) { peak_x = i; peak_y = h; @@ -49,14 +49,14 @@ void menuRadioSpectrum(event_t event) } lcdDrawText(1, 10, "F:", 0); - lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrum.fq/10000000,PREC2); + lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrumAnalyser.freq / 10000000, PREC2); lcdDrawText(lcdLastRightPos + 2, 10, "GHz", 0); lcdDrawText(lcdLastRightPos + 5, 10, "S:", 0); - lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrum.span/1000000, 0); + lcdDrawNumber(lcdLastRightPos + 2, 10, reusableBuffer.spectrumAnalyser.span/1000000, 0); lcdDrawText(lcdLastRightPos + 2, 10, "MHz", 0); int8_t y = max(FH, LCD_H - peak_y - FH); - lcdDrawNumber(min(100, peak_x), y, ((reusableBuffer.spectrum.fq - reusableBuffer.spectrum.span / 2) + peak_x * (reusableBuffer.spectrum.span / 128)) / 1000000, TINSIZE); + lcdDrawNumber(min(100, peak_x), y, ((reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2) + peak_x * (reusableBuffer.spectrumAnalyser.span / 128)) / 1000000, TINSIZE); lcdDrawText(lcdLastRightPos, y, "M", TINSIZE); } diff --git a/radio/src/gui/128x64/radio_tools.cpp b/radio/src/gui/common/stdlcd/radio_tools.cpp similarity index 89% rename from radio/src/gui/128x64/radio_tools.cpp rename to radio/src/gui/common/stdlcd/radio_tools.cpp index 55e772237..e8958af55 100644 --- a/radio/src/gui/128x64/radio_tools.cpp +++ b/radio/src/gui/common/stdlcd/radio_tools.cpp @@ -35,8 +35,8 @@ void addRadioTool(uint8_t index, const char * label, void (* tool)(event_t event void menuRadioTools(event_t event) { - SIMPLE_MENU("TOOLS", menuTabGeneral, MENU_RADIO_TOOLS, HEADER_LINE + 1); - - addRadioTool(0, "Spectrum Analyser", menuRadioSpectrum, event); + SIMPLE_MENU("TOOLS", menuTabGeneral, MENU_RADIO_TOOLS, HEADER_LINE + 2); + addRadioTool(0, "Spectrum Analyser", menuRadioSpectrumAnalyser, event); + addRadioTool(1, "Power Meter", menuRadioPowerMeter, event); } \ No newline at end of file diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 4d4191b60..c3c82927e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1200,11 +1200,18 @@ union ReusableBuffer struct { - uint8_t bars[128]; - uint32_t fq; + uint8_t bars[LCD_W]; + uint32_t freq; uint32_t span; uint32_t step; - } spectrum; + } spectrumAnalyser; + + struct + { + uint32_t freq; + uint32_t power; + uint32_t peak; + } powerMeter; struct { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 3308f30bf..37a6d35b3 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -38,12 +38,6 @@ extern uint8_t dsm2BindTimer; #endif -#if defined(PXX) - #define IS_PXX_PROTOCOL(protocol) (protocol==PROTO_PXX) -#else - #define IS_PXX_PROTOCOL(protocol) (0) -#endif - #if defined(DSM2) #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTOCOL_CHANNELS_DSM2_LP45 && protocol<=PROTOCOL_CHANNELS_DSM2_DSMX) #else @@ -73,6 +67,7 @@ enum ModuleSettingsMode { MODULE_MODE_NORMAL, MODULE_MODE_SPECTRUM_ANALYSER, + MODULE_MODE_POWER_METER, MODULE_MODE_GET_HARDWARE_INFO, MODULE_MODE_RECEIVER_SETTINGS, MODULE_MODE_BEEP_FIRST, @@ -84,8 +79,9 @@ enum ModuleSettingsMode PACK(struct ModuleSettings { uint8_t protocol:4; + uint8_t mode:4; uint8_t paused:1; - uint8_t mode:3; + uint8_t spare:7; uint16_t counter; }); diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 286497bb0..50e7a96f7 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -212,14 +212,30 @@ void Pxx2Pulses::setupSpectrumAnalyser(uint8_t module) addFrameType(PXX2_TYPE_C_POWER_METER, PXX2_TYPE_ID_SPECTRUM); Pxx2Transport::addByte(0x00); - reusableBuffer.spectrum.fq = 2440000000; // 2440MHz - Pxx2Transport::addWord(reusableBuffer.spectrum.fq); + reusableBuffer.spectrumAnalyser.freq = 2440000000; // 2440MHz + Pxx2Transport::addWord(reusableBuffer.spectrumAnalyser.freq); - reusableBuffer.spectrum.span = 40000000; // 40MHz - Pxx2Transport::addWord(reusableBuffer.spectrum.span); + reusableBuffer.spectrumAnalyser.span = 40000000; // 40MHz + Pxx2Transport::addWord(reusableBuffer.spectrumAnalyser.span); - reusableBuffer.spectrum.step = 100000; // 100KHz - Pxx2Transport::addWord(reusableBuffer.spectrum.step); + reusableBuffer.spectrumAnalyser.step = 100000; // 100KHz + Pxx2Transport::addWord(reusableBuffer.spectrumAnalyser.step); +} + + +void Pxx2Pulses::setupPowerMeter(uint8_t module) +{ + if (moduleSettings[module].counter > 1000) { + moduleSettings[module].counter = 1002; + return; + } + + moduleSettings[module].counter = 1002; + + addFrameType(PXX2_TYPE_C_POWER_METER, PXX2_TYPE_ID_POWER_METER); + Pxx2Transport::addByte(0x00); + + Pxx2Transport::addWord(reusableBuffer.powerMeter.freq); } void Pxx2Pulses::setupShareMode(uint8_t module) @@ -248,6 +264,9 @@ void Pxx2Pulses::setupFrame(uint8_t module) case MODULE_MODE_SPECTRUM_ANALYSER: setupSpectrumAnalyser(module); break; + case MODULE_MODE_POWER_METER: + setupPowerMeter(module); + break; case MODULE_MODE_SHARE: setupShareMode(module); break; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index e9a18a47b..5cc3e2581 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -129,6 +129,8 @@ class Pxx2Pulses: public PxxPulses { void setupSpectrumAnalyser(uint8_t module); + void setupPowerMeter(uint8_t module); + void addHead() { // send 7E, do not CRC diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index c55b87974..fd81a338c 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -140,7 +140,6 @@ elseif(PCB STREQUAL XLITES) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) - set(RADIO_SPECTRUM YES) set(STATUS_LEDS YES) endif() @@ -211,7 +210,6 @@ set(GUI_SRC radio_diagkeys.cpp radio_diaganas.cpp radio_hardware.cpp - radio_tools.cpp view_channels.cpp view_telemetry.cpp view_about.cpp @@ -219,14 +217,6 @@ set(GUI_SRC ../screenshot.cpp ) -if(RADIO_SPECTRUM) - add_definitions(-DRADIO_SPECTRUM) - set(GUI_SRC - ${GUI_SRC} - radio_spectrum.cpp - ) -endif() - if(STATUS_LEDS) set(LED_DRIVER led_driver.cpp) endif() diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index d78af961c..e16652ee5 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -151,7 +151,7 @@ void processTelemetryFrame(uint8_t module, uint8_t * frame) sportProcessTelemetryPacketWithoutCrc(&frame[3]); } -void processSpectrumFrame(uint8_t module, uint8_t * frame) +void processSpectrumAnalyserFrame(uint8_t module, uint8_t * frame) { if (moduleSettings[module].mode != MODULE_MODE_SPECTRUM_ANALYSER) { return; @@ -170,10 +170,22 @@ void processSpectrumFrame(uint8_t module, uint8_t * frame) // TRACE("Fq=%u, Pw=%d, X=%d, Y=%d", *frequency, int32_t(*power), D * 128 / 40000000, int32_t(127 + *power)); uint8_t x = D * 128 / 40000000; - reusableBuffer.spectrum.bars[x] = 127 + *power; + reusableBuffer.spectrumAnalyser.bars[x] = 127 + *power; } -void processRadioFrame(uint8_t module, uint8_t * frame) +void processPowerMeterFrame(uint8_t module, uint8_t * frame) +{ + if (moduleSettings[module].mode != MODULE_MODE_POWER_METER) { + return; + } + + reusableBuffer.powerMeter.power = *((uint16_t *)&frame[8]); + if (reusableBuffer.powerMeter.power > reusableBuffer.powerMeter.peak) { + reusableBuffer.powerMeter.peak = reusableBuffer.powerMeter.power; + } +} + +void processModuleFrame(uint8_t module, uint8_t *frame) { switch (frame[2]) { case PXX2_TYPE_ID_HW_INFO: @@ -198,15 +210,15 @@ void processRadioFrame(uint8_t module, uint8_t * frame) } } -void processPowerMeterFrame(uint8_t module, uint8_t * frame) +void processToolsFrame(uint8_t module, uint8_t * frame) { switch (frame[2]) { case PXX2_TYPE_ID_POWER_METER: - // TODO + processPowerMeterFrame(module, frame); break; case PXX2_TYPE_ID_SPECTRUM: - processSpectrumFrame(module, frame); + processSpectrumAnalyserFrame(module, frame); break; } } @@ -215,11 +227,11 @@ void processPXX2TelemetryFrame(uint8_t module, uint8_t * frame) { switch (frame[1]) { case PXX2_TYPE_C_MODULE: - processRadioFrame(module, frame); + processModuleFrame(module, frame); break; case PXX2_TYPE_C_POWER_METER: - processPowerMeterFrame(module, frame); + processToolsFrame(module, frame); break; default: