From d9caabefa11fd5025fba3ea036acc42de504da10 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 1 Nov 2017 01:27:29 -0400 Subject: [PATCH] Removed vtx_settings_config in favor of vtx_common. Removed implicit EEPROM writes for vtx_ changes. Updated MSP_VTX_CONFIG Updated MSP_SET_VTX_CONFIG Updated MSP_VTX_CONFIG (again) Implemented VTX update schedule Removed unneeded initialization blocks from io/vtx implementations Prevent VTX settings from being applied in CLI. Sync Band/Chan/Freq on init Correct issues in SA CMS Moved vtxCommonInit and vtxCommonProcess to io/vtx --- make/source.mk | 4 +- src/main/cms/cms_menu_vtx_rtc6705.c | 18 ++- src/main/cms/cms_menu_vtx_smartaudio.c | 71 ++++++---- src/main/cms/cms_menu_vtx_tramp.c | 14 +- src/main/drivers/vtx_common.c | 58 +++----- src/main/drivers/vtx_common.h | 50 +++++-- src/main/fc/cli.c | 3 +- src/main/fc/fc_init.c | 8 +- src/main/fc/fc_msp.c | 79 ++++------- src/main/fc/fc_tasks.c | 7 +- src/main/fc/settings.c | 4 +- src/main/io/vtx.c | 110 ++++++++++++++++ src/main/io/vtx.h | 35 +++++ src/main/io/vtx_control.c | 88 +++++++------ src/main/io/vtx_rtc6705.c | 29 +--- src/main/io/vtx_settings_config.c | 153 ---------------------- src/main/io/vtx_settings_config.h | 73 ----------- src/main/io/vtx_smartaudio.c | 50 +------ src/main/io/vtx_tramp.c | 53 +------- src/main/rx/spektrum.c | 57 +++++--- src/main/target/STM32F3DISCOVERY/target.h | 1 - src/test/unit/cli_unittest.cc | 2 + 22 files changed, 419 insertions(+), 548 deletions(-) create mode 100644 src/main/io/vtx.c create mode 100644 src/main/io/vtx.h delete mode 100644 src/main/io/vtx_settings_config.c delete mode 100644 src/main/io/vtx_settings_config.h diff --git a/make/source.mk b/make/source.mk index f5cd0f81b..b6dca9688 100644 --- a/make/source.mk +++ b/make/source.mk @@ -168,7 +168,7 @@ FC_SRC = \ telemetry/ibus_shared.c \ sensors/esc_sensor.c \ io/vtx_string.c \ - io/vtx_settings_config.c \ + io/vtx.c \ io/vtx_rtc6705.c \ io/vtx_smartaudio.c \ io/vtx_tramp.c \ @@ -267,7 +267,7 @@ SIZE_OPTIMISED_SRC := $(SIZE_OPTIMISED_SRC) \ cms/cms_menu_misc.c \ cms/cms_menu_osd.c \ io/vtx_string.c \ - io/vtx_settings_config.c \ + io/vtx.c \ io/vtx_rtc6705.c \ io/vtx_smartaudio.c \ io/vtx_tramp.c \ diff --git a/src/main/cms/cms_menu_vtx_rtc6705.c b/src/main/cms/cms_menu_vtx_rtc6705.c index fe25948cc..733cef5a5 100644 --- a/src/main/cms/cms_menu_vtx_rtc6705.c +++ b/src/main/cms/cms_menu_vtx_rtc6705.c @@ -29,11 +29,13 @@ #include "cms/cms.h" #include "cms/cms_types.h" +#include "drivers/vtx_common.h" + +#include "fc/config.h" + #include "io/vtx_string.h" #include "io/vtx_rtc6705.h" -#include "io/vtx_settings_config.h" - -#if defined(VTX_SETTINGS_CONFIG) +#include "io/vtx.h" static uint8_t cmsx_vtxBand; static uint8_t cmsx_vtxChannel; @@ -60,7 +62,13 @@ static void cmsx_Vtx_ConfigRead(void) static void cmsx_Vtx_ConfigWriteback(void) { - vtxSettingsSaveBandChanAndPower(cmsx_vtxBand + 1, cmsx_vtxChannel, cmsx_vtxPower + VTX_RTC6705_MIN_POWER); + // update vtx_ settings + vtxSettingsConfigMutable()->band = cmsx_vtxBand + 1; + vtxSettingsConfigMutable()->channel = cmsx_vtxChannel; + vtxSettingsConfigMutable()->power = cmsx_vtxPower + VTX_RTC6705_MIN_POWER; + vtxSettingsConfigMutable()->freq = vtx58_Bandchan2Freq(cmsx_vtxBand + 1, cmsx_vtxChannel); + + saveConfigAndNotify(); } static long cmsx_Vtx_onEnter(void) @@ -99,6 +107,4 @@ CMS_Menu cmsx_menuVtxRTC6705 = { .entries = cmsx_menuVtxEntries }; -#endif // VTX_SETTINGS_CONFIG - #endif // CMS diff --git a/src/main/cms/cms_menu_vtx_smartaudio.c b/src/main/cms/cms_menu_vtx_smartaudio.c index c7f1db980..23ad9e45d 100644 --- a/src/main/cms/cms_menu_vtx_smartaudio.c +++ b/src/main/cms/cms_menu_vtx_smartaudio.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "platform.h" @@ -30,9 +31,13 @@ #include "cms/cms_types.h" #include "cms/cms_menu_vtx_smartaudio.h" +#include "drivers/vtx_common.h" + +#include "fc/config.h" + #include "io/vtx_string.h" #include "io/vtx_smartaudio.h" -#include "io/vtx_settings_config.h" +#include "io/vtx.h" // Interface to CMS @@ -76,18 +81,16 @@ uint16_t saCmsUserFreqNew; // User defined frequency void saCmsUpdate(void) { // XXX Take care of pit mode update somewhere??? - if (saCmsOpmodel == SACMS_OPMODEL_UNDEF) { // This is a first valid response to GET_SETTINGS. saCmsOpmodel = (saDevice.mode & SA_MODE_GET_PITMODE) ? SACMS_OPMODEL_RACE : SACMS_OPMODEL_FREE; saCmsFselMode = (saDevice.mode & SA_MODE_GET_FREQ_BY_FREQ) ? 1 : 0; - saCmsBand = (saDevice.channel / 8) + 1; - saCmsChan = (saDevice.channel % 8) + 1; - saCmsFreqRef = vtx58frequencyTable[saDevice.channel / 8][saDevice.channel % 8]; - - saCmsDeviceFreq = vtx58frequencyTable[saDevice.channel / 8][saDevice.channel % 8]; + saCmsBand = vtxSettingsConfig()->band; + saCmsChan = vtxSettingsConfig()->channel; + saCmsFreqRef = vtxSettingsConfig()->freq; + saCmsDeviceFreq = saCmsFreqRef; if ((saDevice.mode & SA_MODE_GET_PITMODE) == 0) { saCmsRFState = SACMS_TXMODE_ACTIVE; @@ -97,15 +100,11 @@ void saCmsUpdate(void) saCmsRFState = SACMS_TXMODE_PIT_OUTRANGE; } - if (saDevice.version == 2) { - saCmsPower = saDevice.power + 1; // XXX Take care V1 - } else { - saCmsPower = saDacToPowerIndex(saDevice.power) + 1; - } + saCmsPower = vtxSettingsConfig()->power; // if user-freq mode then track possible change - if (saCmsFselMode != 0 && saDevice.freq != 0) { - saCmsUserFreq = saDevice.freq; + if (saCmsFselMode && vtxSettingsConfig()->freq) { + saCmsUserFreq = vtxSettingsConfig()->freq; } saCmsFselModeNew = saCmsFselMode; //init mode for menu @@ -252,8 +251,9 @@ static long saCmsConfigPowerByGvar(displayPort_t *pDisp, const void *self) return 0; } - if (saCmsOpmodel == SACMS_OPMODEL_FREE) - saSetPowerByIndex(saCmsPower - 1); + if (saCmsOpmodel == SACMS_OPMODEL_FREE && !saDeferred) { + vtxSettingsConfigMutable()->power = saCmsPower; + } return 0; } @@ -417,12 +417,21 @@ static long saCmsCommence(displayPort_t *pDisp, const void *self) UNUSED(pDisp); UNUSED(self); + const vtxSettingsConfig_t prevSettings = { + .band = vtxSettingsConfig()->band, + .channel = vtxSettingsConfig()->channel, + .freq = vtxSettingsConfig()->freq, + .power = vtxSettingsConfig()->power, + }; + vtxSettingsConfig_t newSettings = prevSettings; + if (saCmsOpmodel == SACMS_OPMODEL_RACE) { // Race model // Setup band, freq and power. - saSetBandAndChannel(saCmsBand - 1, saCmsChan - 1); - + newSettings.band = saCmsBand; + newSettings.channel = saCmsChan; + newSettings.freq = vtx58_Bandchan2Freq(saCmsBand, saCmsChan); // If in pit mode, cancel it. if (saCmsPitFMode == 0) @@ -433,14 +442,25 @@ static long saCmsCommence(displayPort_t *pDisp, const void *self) // Freestyle model // Setup band and freq / user freq if (saCmsFselModeNew == 0) { - saSetBandAndChannel(saCmsBand - 1, saCmsChan - 1); + newSettings.band = saCmsBand; + newSettings.channel = saCmsChan; + newSettings.freq = vtx58_Bandchan2Freq(saCmsBand, saCmsChan); } else { saSetMode(0); //make sure FREE mode is setup - saSetFreq(saCmsUserFreq); + newSettings.band = 0; + newSettings.freq = saCmsUserFreq; } } - saSetPowerByIndex(saCmsPower - 1); + newSettings.power = saCmsPower; + + if (memcmp(&prevSettings, &newSettings, sizeof(vtxSettingsConfig_t))) { + vtxSettingsConfigMutable()->band = newSettings.band; + vtxSettingsConfigMutable()->channel = newSettings.channel; + vtxSettingsConfigMutable()->power = newSettings.power; + vtxSettingsConfigMutable()->freq = newSettings.freq; + saveConfigAndNotify(); + } return MENU_CHAIN_BACK; } @@ -496,7 +516,6 @@ static long saCmsConfigUserFreq(displayPort_t *pDisp, const void *self) UNUSED(self); saCmsUserFreq = saCmsUserFreqNew; - //saSetFreq(saCmsUserFreq); return MENU_CHAIN_BACK; } @@ -504,8 +523,8 @@ static long saCmsConfigUserFreq(displayPort_t *pDisp, const void *self) static OSD_Entry saCmsMenuPORFreqEntries[] = { { "- POR FREQ -", OME_Label, NULL, NULL, 0 }, - { "CUR FREQ", OME_UINT16, NULL, &(OSD_UINT16_t){ &saCmsORFreq, 5000, 5900, 0 }, DYNAMIC }, - { "NEW FREQ", OME_UINT16, NULL, &(OSD_UINT16_t){ &saCmsORFreqNew, 5000, 5900, 1 }, 0 }, + { "CUR FREQ", OME_UINT16, NULL, &(OSD_UINT16_t){ &saCmsORFreq, 5000, 5999, 0 }, DYNAMIC }, + { "NEW FREQ", OME_UINT16, NULL, &(OSD_UINT16_t){ &saCmsORFreqNew, 5000, 5999, 1 }, 0 }, { "SET", OME_Funcall, saCmsSetPORFreq, NULL, 0 }, { "BACK", OME_Back, NULL, NULL, 0 }, @@ -525,8 +544,8 @@ static CMS_Menu saCmsMenuPORFreq = static OSD_Entry saCmsMenuUserFreqEntries[] = { { "- USER FREQ -", OME_Label, NULL, NULL, 0 }, - { "CUR FREQ", OME_UINT16, NULL, &(OSD_UINT16_t){ &saCmsUserFreq, 5000, 5900, 0 }, DYNAMIC }, - { "NEW FREQ", OME_UINT16, NULL, &(OSD_UINT16_t){ &saCmsUserFreqNew, 5000, 5900, 1 }, 0 }, + { "CUR FREQ", OME_UINT16, NULL, &(OSD_UINT16_t){ &saCmsUserFreq, 5000, 5999, 0 }, DYNAMIC }, + { "NEW FREQ", OME_UINT16, NULL, &(OSD_UINT16_t){ &saCmsUserFreqNew, 5000, 5999, 1 }, 0 }, { "SET", OME_Funcall, saCmsConfigUserFreq, NULL, 0 }, { "BACK", OME_Back, NULL, NULL, 0 }, diff --git a/src/main/cms/cms_menu_vtx_tramp.c b/src/main/cms/cms_menu_vtx_tramp.c index f74f83675..20e66b972 100644 --- a/src/main/cms/cms_menu_vtx_tramp.c +++ b/src/main/cms/cms_menu_vtx_tramp.c @@ -29,10 +29,13 @@ #include "cms/cms.h" #include "cms/cms_types.h" +#include "drivers/vtx_common.h" + +#include "fc/config.h" + #include "io/vtx_string.h" #include "io/vtx_tramp.h" -#include "io/vtx_settings_config.h" - +#include "io/vtx.h" char trampCmsStatusString[31] = "- -- ---- ----"; // m bc ffff tppp @@ -154,7 +157,12 @@ static long trampCmsCommence(displayPort_t *pDisp, const void *self) trampCommitChanges(); // update'vtx_' settings - vtxSettingsSaveBandChanAndPower(trampCmsBand, trampCmsChan, trampCmsPower); + vtxSettingsConfigMutable()->band = trampCmsBand; + vtxSettingsConfigMutable()->channel = trampCmsChan; + vtxSettingsConfigMutable()->power = trampCmsPower; + vtxSettingsConfigMutable()->freq = vtx58_Bandchan2Freq(trampCmsBand, trampCmsChan); + + saveConfigAndNotify(); return MENU_CHAIN_BACK; } diff --git a/src/main/drivers/vtx_common.c b/src/main/drivers/vtx_common.c index 7b0d5d83e..eb71bb260 100644 --- a/src/main/drivers/vtx_common.c +++ b/src/main/drivers/vtx_common.c @@ -24,19 +24,18 @@ #include "platform.h" #include "build/debug.h" +#include "common/time.h" +#include "drivers/vtx_common.h" +#include "fc/config.h" #if defined(VTX_COMMON) -#include "vtx_common.h" - vtxDevice_t *vtxDevice = NULL; void vtxCommonInit(void) { } -// Whatever registered last will win - void vtxCommonRegisterDevice(vtxDevice_t *pDevice) { vtxDevice = pDevice; @@ -47,15 +46,6 @@ bool vtxCommonDeviceRegistered(void) return vtxDevice; } -void vtxCommonProcess(uint32_t currentTimeUs) -{ - if (!vtxDevice) - return; - - if (vtxDevice->vTable->process) - vtxDevice->vTable->process(currentTimeUs); -} - vtxDevType_e vtxCommonGetDeviceType(void) { if (!vtxDevice || !vtxDevice->vTable->getDeviceType) @@ -64,47 +54,41 @@ vtxDevType_e vtxCommonGetDeviceType(void) return vtxDevice->vTable->getDeviceType(); } +void vtxCommonProcess(timeUs_t currentTimeUs) { + if (vtxDevice->vTable->process) { + vtxDevice->vTable->process(currentTimeUs); + } +} + // band and channel are 1 origin void vtxCommonSetBandAndChannel(uint8_t band, uint8_t channel) { - if (!vtxDevice) - return; - - if ((band > vtxDevice->capability.bandCount) || (channel > vtxDevice->capability.channelCount)) - return; - - if (vtxDevice->vTable->setBandAndChannel) - vtxDevice->vTable->setBandAndChannel(band, channel); + if ((band <= vtxDevice->capability.bandCount) && (channel <= vtxDevice->capability.channelCount)) { + if (vtxDevice->vTable->setBandAndChannel) { + vtxDevice->vTable->setBandAndChannel(band, channel); + } + } } // index is zero origin, zero = power off completely void vtxCommonSetPowerByIndex(uint8_t index) { - if (!vtxDevice) - return; - - if (index > vtxDevice->capability.powerCount) - return; - - if (vtxDevice->vTable->setPowerByIndex) - vtxDevice->vTable->setPowerByIndex(index); + if (index <= vtxDevice->capability.powerCount) { + if (vtxDevice->vTable->setPowerByIndex) { + vtxDevice->vTable->setPowerByIndex(index); + } + } } // on = 1, off = 0 void vtxCommonSetPitMode(uint8_t onoff) { - if (!vtxDevice) - return; - if (vtxDevice->vTable->setPitMode) vtxDevice->vTable->setPitMode(onoff); } void vtxCommonSetFrequency(uint16_t freq) { - if (!vtxDevice) { - return; - } if (vtxDevice->vTable->setFrequency) { vtxDevice->vTable->setFrequency(freq); } @@ -112,9 +96,6 @@ void vtxCommonSetFrequency(uint16_t freq) bool vtxCommonGetBandAndChannel(uint8_t *pBand, uint8_t *pChannel) { - if (!vtxDevice) - return false; - if (vtxDevice->vTable->getBandAndChannel) return vtxDevice->vTable->getBandAndChannel(pBand, pChannel); else @@ -163,4 +144,5 @@ bool vtxCommonGetDeviceCapability(vtxDeviceCapability_t *pDeviceCapability) memcpy(pDeviceCapability, &vtxDevice->capability, sizeof(vtxDeviceCapability_t)); return true; } + #endif diff --git a/src/main/drivers/vtx_common.h b/src/main/drivers/vtx_common.h index d3652d160..aea9e7fd0 100644 --- a/src/main/drivers/vtx_common.h +++ b/src/main/drivers/vtx_common.h @@ -19,22 +19,54 @@ #pragma once +#include "common/time.h" +#include "io/vtx.h" + +#define VTX_SETTINGS_MIN_BAND 1 +#define VTX_SETTINGS_MAX_BAND 5 +#define VTX_SETTINGS_MIN_CHANNEL 1 +#define VTX_SETTINGS_MAX_CHANNEL 8 + +#define VTX_SETTINGS_BAND_COUNT (VTX_SETTINGS_MAX_BAND - VTX_SETTINGS_MIN_BAND + 1) +#define VTX_SETTINGS_CHANNEL_COUNT (VTX_SETTINGS_MAX_CHANNEL - VTX_SETTINGS_MIN_CHANNEL + 1) + +#define VTX_SETTINGS_DEFAULT_BAND 4 +#define VTX_SETTINGS_DEFAULT_CHANNEL 1 +#define VTX_SETTINGS_DEFAULT_FREQ 5740 + +#define VTX_SETTINGS_MAX_FREQUENCY_MHZ 5999 //max freq (in MHz) for 'vtx_freq' setting + +#if defined(VTX_SMARTAUDIO) || defined(VTX_TRAMP) + +#define VTX_SETTINGS_POWER_COUNT 5 +#define VTX_SETTINGS_DEFAULT_POWER 1 +#define VTX_SETTINGS_MIN_POWER 0 +#define VTX_SETTINGS_FREQCMD + +#elif defined(VTX_RTC6705) + +#include "io/vtx_rtc6705.h" + +#define VTX_SETTINGS_POWER_COUNT VTX_RTC6705_POWER_COUNT +#define VTX_SETTINGS_DEFAULT_POWER VTX_RTC6705_DEFAULT_POWER +#define VTX_SETTINGS_MIN_POWER VTX_RTC6705_MIN_POWER + +#endif + // check value for MSP_SET_VTX_CONFIG to determine if value is encoded // band/channel or frequency in MHz (3 bits for band and 3 bits for channel) #define VTXCOMMON_MSP_BANDCHAN_CHKVAL ((uint16_t)((7 << 3) + 7)) typedef enum { VTXDEV_UNSUPPORTED = 0, // reserved for MSP - VTXDEV_RTC6705 = 1, + VTXDEV_RTC6705 = 1, // 2 reserved - VTXDEV_SMARTAUDIO = 3, - VTXDEV_TRAMP = 4, - VTXDEV_UNKNOWN = 0xFF, + VTXDEV_SMARTAUDIO = 3, + VTXDEV_TRAMP = 4, + VTXDEV_UNKNOWN = 0xFF, } vtxDevType_e; - // VTX magic numbers - #define VTX_COMMON_BAND_USER 0 #define VTX_COMMON_BAND_A 1 #define VTX_COMMON_BAND_B 2 @@ -47,14 +79,14 @@ typedef enum { #define VTX_6705_POWER_25 1 #define VTX_6705_POWER_200 2 -// SmartAudio "---", 25, 200, 500. 800 mW +// SmartAudio "---", 25, 200, 500, 800 mW #define VTX_SA_POWER_OFF 0 #define VTX_SA_POWER_25 1 #define VTX_SA_POWER_200 2 #define VTX_SA_POWER_500 3 #define VTX_SA_POWER_800 4 -// Tramp "---", 25, 200, 400. 600 mW +// Tramp "---", 25, 100, 200, 400, 600 mW #define VTX_TRAMP_POWER_OFF 0 #define VTX_TRAMP_POWER_25 1 #define VTX_TRAMP_POWER_100 2 @@ -117,7 +149,7 @@ void vtxCommonRegisterDevice(vtxDevice_t *pDevice); bool vtxCommonDeviceRegistered(void); // VTable functions -void vtxCommonProcess(uint32_t currentTimeUs); +void vtxCommonProcess(timeUs_t currentTimeUs); uint8_t vtxCommonGetDeviceType(void); void vtxCommonSetBandAndChannel(uint8_t band, uint8_t channel); void vtxCommonSetPowerByIndex(uint8_t level); diff --git a/src/main/fc/cli.c b/src/main/fc/cli.c index 5e8f2a5f4..69761cd19 100755 --- a/src/main/fc/cli.c +++ b/src/main/fc/cli.c @@ -80,6 +80,7 @@ extern uint8_t __config_end; #include "drivers/vcd.h" #include "drivers/light_led.h" #include "drivers/camera_control.h" +#include "drivers/vtx_common.h" #include "fc/settings.h" #include "fc/cli.h" @@ -112,7 +113,7 @@ extern uint8_t __config_end; #include "io/serial.h" #include "io/transponder_ir.h" #include "io/vtx_control.h" -#include "io/vtx_settings_config.h" +#include "io/vtx.h" #include "msp/msp_protocol.h" diff --git a/src/main/fc/fc_init.c b/src/main/fc/fc_init.c index 1a8976742..5775b12b7 100644 --- a/src/main/fc/fc_init.c +++ b/src/main/fc/fc_init.c @@ -100,6 +100,7 @@ #include "io/osd.h" #include "io/osd_slave.h" #include "io/displayport_msp.h" +#include "io/vtx.h" #include "io/vtx_rtc6705.h" #include "io/vtx_control.h" #include "io/vtx_smartaudio.h" @@ -388,10 +389,10 @@ void init(void) featureClear(FEATURE_3D); idlePulse = 0; // brushed motors } - /* Motors needs to be initialized soon as posible because hardware initialization + /* Motors needs to be initialized soon as posible because hardware initialization * may send spurious pulses to esc's causing their early initialization. Also ppm * receiver may share timer with motors so motors MUST be initialized here. */ - motorDevInit(&motorConfig()->dev, idlePulse, getMotorCount()); + motorDevInit(&motorConfig()->dev, idlePulse, getMotorCount()); systemState |= SYSTEM_STATE_MOTORS_READY; if (0) {} @@ -665,7 +666,10 @@ void init(void) #ifdef VTX_CONTROL vtxControlInit(); +#if defined(VTX_COMMON) vtxCommonInit(); + vtxInit(); +#endif #ifdef VTX_SMARTAUDIO vtxSmartAudioInit(); diff --git a/src/main/fc/fc_msp.c b/src/main/fc/fc_msp.c index 7cfdbe5f0..f4a63b03f 100644 --- a/src/main/fc/fc_msp.c +++ b/src/main/fc/fc_msp.c @@ -89,6 +89,8 @@ #include "io/servos.h" #include "io/transponder_ir.h" #include "io/vtx_control.h" +#include "io/vtx.h" +#include "io/vtx_string.h" #include "msp/msp.h" #include "msp/msp_protocol.h" @@ -938,7 +940,7 @@ static bool mspProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst) #ifdef USE_DSHOT case MSP_ESC_SENSOR_DATA: sbufWriteU8(dst, getMotorCount()); - for (int i = 0; i < getMotorCount(); i++) { + for (int i = 0; i < getMotorCount(); i++) { sbufWriteU8(dst, getEscSensorData(i)->temperature); sbufWriteU16(dst, getEscSensorData(i)->rpm); } @@ -1200,25 +1202,14 @@ static bool mspProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst) { uint8_t deviceType = vtxCommonGetDeviceType(); if (deviceType != VTXDEV_UNKNOWN) { - - uint8_t band=0, channel=0; - vtxCommonGetBandAndChannel(&band,&channel); - - uint8_t powerIdx=0; // debug - vtxCommonGetPowerIndex(&powerIdx); - uint8_t pitmode=0; vtxCommonGetPitMode(&pitmode); - - uint16_t freq = 0; - vtxCommonGetFrequency(&freq); - sbufWriteU8(dst, deviceType); - sbufWriteU8(dst, band); - sbufWriteU8(dst, channel); - sbufWriteU8(dst, powerIdx); + sbufWriteU8(dst, vtxSettingsConfig()->band); + sbufWriteU8(dst, vtxSettingsConfig()->channel); + sbufWriteU8(dst, vtxSettingsConfig()->power); sbufWriteU8(dst, pitmode); - sbufWriteU16(dst, freq); + sbufWriteU16(dst, vtxSettingsConfig()->freq); // future extensions here... } else { sbufWriteU8(dst, VTXDEV_UNKNOWN); // no VTX detected @@ -1673,43 +1664,31 @@ static mspResult_e mspProcessInCommand(uint8_t cmdMSP, sbuf_t *src) #ifdef VTX_COMMON case MSP_SET_VTX_CONFIG: { - const uint16_t tmp = sbufReadU16(src); - - if (vtxCommonGetDeviceType() != VTXDEV_UNKNOWN) { - - if (tmp <= VTXCOMMON_MSP_BANDCHAN_CHKVAL) { //value is band and channel - const uint8_t band = (tmp / 8) + 1; - const uint8_t channel = (tmp % 8) + 1; - uint8_t current_band = 0, current_channel = 0; - vtxCommonGetBandAndChannel(¤t_band, ¤t_channel); - if ((current_band != band) || (current_channel != channel)) { - vtxCommonSetBandAndChannel(band, channel); + if (vtxCommonDeviceRegistered()) { + if (vtxCommonGetDeviceType() != VTXDEV_UNKNOWN) { + uint16_t newFrequency = sbufReadU16(src); + if (newFrequency <= VTXCOMMON_MSP_BANDCHAN_CHKVAL) { //value is band and channel + const uint8_t newBand = (newFrequency / 8) + 1; + const uint8_t newChannel = (newFrequency % 8) + 1; + vtxSettingsConfigMutable()->band = newBand; + vtxSettingsConfigMutable()->channel = newChannel; + vtxSettingsConfigMutable()->freq = vtx58_Bandchan2Freq(newBand, newChannel); + } else { //value is frequency in MHz + vtxSettingsConfigMutable()->band = 0; + vtxSettingsConfigMutable()->freq = newFrequency; } - } else { //value is frequency in MHz - uint16_t currentFreq; - vtxCommonGetFrequency(¤tFreq); - if (currentFreq != tmp) { - vtxCommonSetFrequency(tmp); + + if (sbufBytesRemaining(src) > 1) { + vtxSettingsConfigMutable()->power = sbufReadU8(src); + // Delegate pitmode to vtx directly + const uint8_t newPitmode = sbufReadU8(src); + uint8_t currentPitmode = 0; + vtxCommonGetPitMode(¤tPitmode); + if (currentPitmode != newPitmode) { + vtxCommonSetPitMode(newPitmode); + } } } - - if (sbufBytesRemaining(src) < 2) { - break; - } - - uint8_t power = sbufReadU8(src); - uint8_t current_power = 0; - vtxCommonGetPowerIndex(¤t_power); - if (current_power != power) { - vtxCommonSetPowerByIndex(power); - } - - uint8_t pitmode = sbufReadU8(src); - uint8_t current_pitmode = 0; - vtxCommonGetPitMode(¤t_pitmode); - if (current_pitmode != pitmode) { - vtxCommonSetPitMode(pitmode); - } } } break; diff --git a/src/main/fc/fc_tasks.c b/src/main/fc/fc_tasks.c index 3fd0ad618..b545091c7 100644 --- a/src/main/fc/fc_tasks.c +++ b/src/main/fc/fc_tasks.c @@ -63,6 +63,7 @@ #include "io/transponder_ir.h" #include "io/vtx_tramp.h" // Will be gone #include "io/rcdevice_cam.h" +#include "io/vtx.h" #include "msp/msp_serial.h" @@ -209,13 +210,13 @@ static void taskTelemetry(timeUs_t currentTimeUs) #ifdef VTX_CONTROL // Everything that listens to VTX devices -void taskVtxControl(uint32_t currentTime) +void taskVtxControl(timeUs_t currentTime) { - if (ARMING_FLAG(ARMED)) + if (ARMING_FLAG(ARMED) || cliMode) return; #ifdef VTX_COMMON - vtxCommonProcess(currentTime); + vtxProcess(currentTime); #endif } #endif diff --git a/src/main/fc/settings.c b/src/main/fc/settings.c index b7a836f6f..5042205b0 100644 --- a/src/main/fc/settings.c +++ b/src/main/fc/settings.c @@ -41,6 +41,7 @@ #include "drivers/light_led.h" #include "drivers/camera_control.h" #include "drivers/max7456.h" +#include "drivers/vtx_common.h" #include "fc/config.h" #include "fc/controlrate_profile.h" @@ -65,7 +66,6 @@ #include "io/osd.h" #include "io/vtx_control.h" #include "io/vtx_rtc6705.h" -#include "io/vtx_settings_config.h" #include "rx/rx.h" #include "rx/spektrum.h" @@ -744,7 +744,7 @@ const clivalue_t valueTable[] = { { "pwr_on_arm_grace", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 30 }, PG_SYSTEM_CONFIG, offsetof(systemConfig_t, powerOnArmingGraceTime) }, // PG_VTX_CONFIG -#ifdef VTX_SETTINGS_CONFIG +#ifdef VTX_COMMON { "vtx_band", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, VTX_SETTINGS_MAX_BAND }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, band) }, { "vtx_channel", VAR_UINT8 | MASTER_VALUE, .config.minmax = { VTX_SETTINGS_MIN_CHANNEL, VTX_SETTINGS_MAX_CHANNEL }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, channel) }, { "vtx_power", VAR_UINT8 | MASTER_VALUE, .config.minmax = { VTX_SETTINGS_MIN_POWER, VTX_SETTINGS_POWER_COUNT }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, power) }, diff --git a/src/main/io/vtx.c b/src/main/io/vtx.c new file mode 100644 index 000000000..1e87f43e3 --- /dev/null +++ b/src/main/io/vtx.c @@ -0,0 +1,110 @@ +/* + * This file is part of Cleanflight. + * + * Cleanflight is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Cleanflight 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. + * + * You should have received a copy of the GNU General Public License + * along with Cleanflight. If not, see . + */ + +#include "common/time.h" +#include "drivers/vtx_common.h" +#include "fc/config.h" +#include "io/vtx.h" +#include "io/vtx_string.h" + +#if defined(VTX_COMMON) + +PG_REGISTER_WITH_RESET_TEMPLATE(vtxSettingsConfig_t, vtxSettingsConfig, PG_VTX_SETTINGS_CONFIG, 0); + +PG_RESET_TEMPLATE(vtxSettingsConfig_t, vtxSettingsConfig, + .band = VTX_SETTINGS_DEFAULT_BAND, + .channel = VTX_SETTINGS_DEFAULT_CHANNEL, + .power = VTX_SETTINGS_DEFAULT_POWER, + .freq = VTX_SETTINGS_DEFAULT_FREQ +); + +#define VTX_PARAM_CYCLE_TIME_US 100000 // 10Hz + +typedef enum { + VTX_PARAM_BANDCHAN = 0, + VTX_PARAM_POWER, + VTX_PARAM_COUNT +} vtxScheduleParams_e; + +static uint8_t vtxParamScheduleCount; +static uint8_t vtxParamSchedule[VTX_PARAM_COUNT]; + +void vtxInit(void) +{ + uint8_t index = 0; + vtxParamSchedule[index++] = VTX_PARAM_BANDCHAN; + vtxParamSchedule[index++] = VTX_PARAM_POWER; + vtxParamScheduleCount = index; + + // sync frequency in parameter group when band/channel are specified + const uint16_t freq = vtx58_Bandchan2Freq(vtxSettingsConfig()->band, vtxSettingsConfig()->channel); + if (vtxSettingsConfig()->band && freq != vtxSettingsConfig()->freq) { + vtxSettingsConfigMutable()->freq = freq; + saveConfigAndNotify(); + } +} + +void vtxProcess(timeUs_t currentTimeUs) +{ + static timeUs_t lastCycleTimeUs; + static uint8_t scheduleIndex; + + if (vtxCommonDeviceRegistered()) { + uint8_t currentSchedule = vtxParamSchedule[scheduleIndex]; + // Process VTX changes from the parameter group at 10Hz + if (currentTimeUs > lastCycleTimeUs + VTX_PARAM_CYCLE_TIME_US) { + switch (currentSchedule) + { + case VTX_PARAM_BANDCHAN: + if (vtxSettingsConfig()->band) { + uint8_t vtxBand; + uint8_t vtxChan; + if (vtxCommonGetBandAndChannel(&vtxBand, &vtxChan)) { + if (vtxSettingsConfig()->band != vtxBand || vtxSettingsConfig()->channel != vtxChan) { + vtxCommonSetBandAndChannel(vtxSettingsConfig()->band, vtxSettingsConfig()->channel); + } + } +#if defined(VTX_SETTINGS_FREQCMD) + } else { + uint16_t vtxFreq; + if (vtxCommonGetFrequency(&vtxFreq)) { + if (vtxSettingsConfig()->freq != vtxFreq) { + vtxCommonSetFrequency(vtxSettingsConfig()->freq); + } + } +#endif + } + break; + case VTX_PARAM_POWER: ; + uint8_t vtxPower; + if (vtxCommonGetPowerIndex(&vtxPower)) { + if (vtxSettingsConfig()->power != vtxPower) { + vtxCommonSetPowerByIndex(vtxSettingsConfig()->power); + } + } + break; + default: + break; + } + lastCycleTimeUs = currentTimeUs; + scheduleIndex = (scheduleIndex + 1) % vtxParamScheduleCount; + } + vtxCommonProcess(currentTimeUs); + } +} + +#endif diff --git a/src/main/io/vtx.h b/src/main/io/vtx.h new file mode 100644 index 000000000..ee32a401f --- /dev/null +++ b/src/main/io/vtx.h @@ -0,0 +1,35 @@ +/* + * This file is part of Cleanflight. + * + * Cleanflight is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Cleanflight 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. + * + * You should have received a copy of the GNU General Public License + * along with Cleanflight. If not, see . + */ + +#pragma once + +#include "drivers/vtx_common.h" + +#include "config/parameter_group.h" +#include "config/parameter_group_ids.h" + +typedef struct vtxSettingsConfig_s { + uint8_t band; // 1=A, 2=B, 3=E, 4=F(Airwaves/Fatshark), 5=Raceband + uint8_t channel; // 1-8 + uint8_t power; // 0 = lowest + uint16_t freq; // sets freq in MHz if band=0 +} vtxSettingsConfig_t; + +PG_DECLARE(vtxSettingsConfig_t, vtxSettingsConfig); + +void vtxInit(void); +void vtxProcess(uint32_t currentTimeUs); diff --git a/src/main/io/vtx_control.c b/src/main/io/vtx_control.c index 17de43bb1..275f23093 100644 --- a/src/main/io/vtx_control.c +++ b/src/main/io/vtx_control.c @@ -40,6 +40,7 @@ #include "io/beeper.h" #include "io/osd.h" #include "io/vtx_control.h" +#include "io/vtx.h" @@ -63,10 +64,9 @@ static void vtxUpdateBandAndChannel(uint8_t bandStep, uint8_t channelStep) locked = 1; } - if (!locked) { - uint8_t band = 0, channel = 0; - vtxCommonGetBandAndChannel(&band, &channel); - vtxCommonSetBandAndChannel(band + bandStep, channel + channelStep); + if (!locked && vtxCommonDeviceRegistered()) { + vtxSettingsConfigMutable()->band += bandStep; + vtxSettingsConfigMutable()->channel += channelStep; } } @@ -96,7 +96,7 @@ void vtxUpdateActivatedChannel(void) locked = 1; } - if (!locked) { + if (!locked && vtxCommonDeviceRegistered()) { static uint8_t lastIndex = -1; for (uint8_t index = 0; index < MAX_CHANNEL_ACTIVATION_CONDITION_COUNT; index++) { @@ -106,7 +106,8 @@ void vtxUpdateActivatedChannel(void) && index != lastIndex) { lastIndex = index; - vtxCommonSetBandAndChannel(vtxChannelActivationCondition->band, vtxChannelActivationCondition->channel); + vtxSettingsConfigMutable()->band = vtxChannelActivationCondition->band; + vtxSettingsConfigMutable()->channel = vtxChannelActivationCondition->channel; break; } } @@ -115,49 +116,54 @@ void vtxUpdateActivatedChannel(void) void vtxCycleBandOrChannel(const uint8_t bandStep, const uint8_t channelStep) { - uint8_t band = 0, channel = 0; - vtxDeviceCapability_t capability; + if (vtxCommonDeviceRegistered()) { + uint8_t band = 0, channel = 0; + vtxDeviceCapability_t capability; - bool haveAllNeededInfo = vtxCommonGetBandAndChannel(&band, &channel) && vtxCommonGetDeviceCapability(&capability); - if (!haveAllNeededInfo) { - return; + bool haveAllNeededInfo = vtxCommonGetBandAndChannel(&band, &channel) && vtxCommonGetDeviceCapability(&capability); + if (!haveAllNeededInfo) { + return; + } + + int newChannel = channel + channelStep; + if (newChannel > capability.channelCount) { + newChannel = 1; + } else if (newChannel < 1) { + newChannel = capability.channelCount; + } + + int newBand = band + bandStep; + if (newBand > capability.bandCount) { + newBand = 1; + } else if (newBand < 1) { + newBand = capability.bandCount; + } + + vtxSettingsConfigMutable()->band = newBand; + vtxSettingsConfigMutable()->channel = newChannel; } - - int newChannel = channel + channelStep; - if (newChannel > capability.channelCount) { - newChannel = 1; - } else if (newChannel < 1) { - newChannel = capability.channelCount; - } - - int newBand = band + bandStep; - if (newBand > capability.bandCount) { - newBand = 1; - } else if (newBand < 1) { - newBand = capability.bandCount; - } - - vtxCommonSetBandAndChannel(newBand, newChannel); } void vtxCyclePower(const uint8_t powerStep) { - uint8_t power = 0; - vtxDeviceCapability_t capability; + if (vtxCommonDeviceRegistered()) { + uint8_t power = 0; + vtxDeviceCapability_t capability; - bool haveAllNeededInfo = vtxCommonGetPowerIndex(&power) && vtxCommonGetDeviceCapability(&capability); - if (!haveAllNeededInfo) { - return; + bool haveAllNeededInfo = vtxCommonGetPowerIndex(&power) && vtxCommonGetDeviceCapability(&capability); + if (!haveAllNeededInfo) { + return; + } + + int newPower = power + powerStep; + if (newPower >= capability.powerCount) { + newPower = 0; + } else if (newPower < 0) { + newPower = capability.powerCount; + } + + vtxSettingsConfigMutable()->power = newPower; } - - int newPower = power + powerStep; - if (newPower >= capability.powerCount) { - newPower = 0; - } else if (newPower < 0) { - newPower = capability.powerCount; - } - - vtxCommonSetPowerByIndex(newPower); } /** diff --git a/src/main/io/vtx_rtc6705.c b/src/main/io/vtx_rtc6705.c index 66bf5e78a..ec24ae424 100644 --- a/src/main/io/vtx_rtc6705.c +++ b/src/main/io/vtx_rtc6705.c @@ -38,14 +38,14 @@ #include "drivers/system.h" #include "drivers/time.h" -#include "drivers/vtx_common.h" #include "drivers/vtx_rtc6705.h" +#include "drivers/vtx_common.h" #include "fc/rc_controls.h" #include "fc/runtime_config.h" +#include "io/vtx.h" #include "io/vtx_rtc6705.h" -#include "io/vtx_settings_config.h" #include "io/vtx_string.h" bool canUpdateVTX(void); @@ -97,28 +97,9 @@ static void vtxRTC6705EnableAndConfigure(void) } #endif -void vtxRTC6705Process(uint32_t now) +void vtxRTC6705Process(timeUs_t now) { UNUSED(now); - - static bool configured = false; - if (!configured) { - vtxRTC6705.band = vtxSettingsConfig()->band; - vtxRTC6705.channel = vtxSettingsConfig()->channel; - vtxRTC6705.powerIndex = MAX(vtxSettingsConfig()->power, VTX_RTC6705_MIN_POWER); - -#ifdef RTC6705_POWER_PIN - if (vtxRTC6705.powerIndex > 0) { - vtxRTC6705EnableAndConfigure(); - } else { - rtc6705Disable(); - } -#else - vtxRTC6705Configure(); -#endif - - configured = true; - } } #ifdef VTX_COMMON @@ -145,8 +126,6 @@ void vtxRTC6705SetBandAndChannel(uint8_t band, uint8_t channel) vtxRTC6705.band = band; vtxRTC6705.channel = channel; - - vtxSettingsSaveBandAndChannel(band, channel); } } @@ -154,8 +133,6 @@ void vtxRTC6705SetPowerByIndex(uint8_t index) { WAIT_FOR_VTX; - vtxSettingsSavePowerByIndex(index); - #ifdef RTC6705_POWER_PIN if (index == 0) { // power device off diff --git a/src/main/io/vtx_settings_config.c b/src/main/io/vtx_settings_config.c deleted file mode 100644 index a82b27bd3..000000000 --- a/src/main/io/vtx_settings_config.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * This file is part of Cleanflight. - * - * Cleanflight is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Cleanflight 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. - * - * You should have received a copy of the GNU General Public License - * along with Cleanflight. If not, see . - */ - -#include "platform.h" - -#include "config/parameter_group.h" -#include "config/parameter_group_ids.h" -#include "fc/config.h" - -#include "io/vtx_settings_config.h" -#include "io/vtx_string.h" - -#ifdef VTX_SETTINGS_CONFIG - -PG_REGISTER_WITH_RESET_TEMPLATE(vtxSettingsConfig_t, vtxSettingsConfig, PG_VTX_SETTINGS_CONFIG, 0); - -PG_RESET_TEMPLATE(vtxSettingsConfig_t, vtxSettingsConfig, - .band = VTX_SETTINGS_DEFAULT_BAND, - .channel = VTX_SETTINGS_DEFAULT_CHANNEL, - .power = VTX_SETTINGS_DEFAULT_POWER, - .freq = 0 -); - -static bool vtxChangePending = false; - -static void vtxChangeSetting(bool changed) -{ - if (changed && !vtxChangePending) { - vtxChangePending = true; - } -} - -static bool vtxSetBand(uint8_t band) -{ - if (band != vtxSettingsConfig()->band) { - vtxSettingsConfigMutable()->band = band; - return true; - } - return false; -} - -static bool vtxSetChannel(uint8_t channel) -{ - if (channel != vtxSettingsConfig()->channel) { - vtxSettingsConfigMutable()->channel = channel; - return true; - } - return false; -} - -static bool vtxSetFreq(uint16_t freq) -{ - if (freq && freq != vtxSettingsConfig()->freq) { - uint8_t band; - uint8_t channel; - if (vtx58_Freq2Bandchan(freq, &band, &channel)) { - vtxChangeSetting(vtxSetBand(band)); - vtxChangeSetting(vtxSetChannel(channel)); - } else { - vtxChangeSetting(vtxSetBand(0)); - } - vtxSettingsConfigMutable()->freq = freq; - return true; - } - return false; -} - -static bool vtxSetPower(uint8_t powerIndex) -{ - if (powerIndex != vtxSettingsConfig()->power) { - vtxSettingsConfigMutable()->power = powerIndex; - return true; - } - return false; -} - -static void vtxCommitChanges(void) -{ - if (vtxChangePending) { - saveConfigAndNotify(); - } - vtxChangePending = false; -} - -//Saves the given band/channel values to configuration settings. -// band: Band value (1 to 5). -// channel: Channel value (1 to 8). -void vtxSettingsSaveBandAndChannel(uint8_t band, uint8_t channel) -{ - vtxChangeSetting(vtxSetBand(band)); - vtxChangeSetting(vtxSetChannel(channel)); - if (band) { - vtxChangeSetting(vtxSetFreq(vtx58_Bandchan2Freq(band, channel))); - } - vtxCommitChanges(); -} - -//Saves the given power-index value to the configuration setting. -// index: Power-index value. -void vtxSettingsSavePowerByIndex(uint8_t index) -{ - vtxChangeSetting(vtxSetPower(index)); - vtxCommitChanges(); -} - -//Saves the given band/channel/power values to configuration settings. -// band: Band value (1 to 5). -// channel: Channel value (1 to 8). -// index: Power-index value. -void vtxSettingsSaveBandChanAndPower(uint8_t band, uint8_t channel, uint8_t index) -{ - vtxChangeSetting(vtxSetBand(band)); - vtxChangeSetting(vtxSetChannel(channel)); - vtxChangeSetting(vtxSetPower(index)); - if (band) { - vtxChangeSetting(vtxSetFreq(vtx58_Bandchan2Freq(band, channel))); - } - vtxCommitChanges(); -} - -//Saves the given frequency value to the configuration setting. -// freq: Frequency value in MHz. -void vtxSettingsSaveFrequency(uint16_t freq) -{ - vtxChangeSetting(vtxSetFreq(freq)); - vtxCommitChanges(); -} - -//Saves the given frequency/power values to configuration settings. -// freq: Frequency value in MHz. -// index: Power-index value. -void vtxSettingsSaveFreqAndPower(uint16_t freq, uint8_t index) -{ - vtxChangeSetting(vtxSetFreq(freq)); - vtxChangeSetting(vtxSetPower(index)); - vtxCommitChanges(); -} - -#endif //VTX_SETTINGS_CONFIG diff --git a/src/main/io/vtx_settings_config.h b/src/main/io/vtx_settings_config.h deleted file mode 100644 index 4417dd879..000000000 --- a/src/main/io/vtx_settings_config.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This file is part of Cleanflight. - * - * Cleanflight is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Cleanflight 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. - * - * You should have received a copy of the GNU General Public License - * along with Cleanflight. If not, see . - */ - -#pragma once - -#define VTX_SETTINGS_MIN_BAND 1 -#define VTX_SETTINGS_MAX_BAND 5 -#define VTX_SETTINGS_MIN_CHANNEL 1 -#define VTX_SETTINGS_MAX_CHANNEL 8 - -#define VTX_SETTINGS_BAND_COUNT (VTX_SETTINGS_MAX_BAND - VTX_SETTINGS_MIN_BAND + 1) -#define VTX_SETTINGS_CHANNEL_COUNT (VTX_SETTINGS_MAX_CHANNEL - VTX_SETTINGS_MIN_CHANNEL + 1) - -#define VTX_SETTINGS_DEFAULT_BAND 4 //Fatshark/Airwaves -#define VTX_SETTINGS_DEFAULT_CHANNEL 1 //CH1 - -#define VTX_SETTINGS_MAX_FREQUENCY_MHZ 5999 //max freq (in MHz) for 'vtx_freq' setting - -#if defined(VTX_SMARTAUDIO) || defined(VTX_TRAMP) - -#define VTX_SETTINGS_POWER_COUNT 5 -#define VTX_SETTINGS_DEFAULT_POWER 1 -#define VTX_SETTINGS_MIN_POWER 0 -#define VTX_SETTINGS_CONFIG -#define VTX_SETTINGS_FREQCMD - -#elif defined(VTX_RTC6705) - -#include "io/vtx_rtc6705.h" - -#define VTX_SETTINGS_POWER_COUNT VTX_RTC6705_POWER_COUNT -#define VTX_SETTINGS_DEFAULT_POWER VTX_RTC6705_DEFAULT_POWER -#define VTX_SETTINGS_MIN_POWER VTX_RTC6705_MIN_POWER -#define VTX_SETTINGS_CONFIG - -#endif - - -#ifdef VTX_SETTINGS_CONFIG - -#include "config/parameter_group.h" -#include "config/parameter_group_ids.h" - -typedef struct vtxSettingsConfig_s { - uint8_t band; // 1=A, 2=B, 3=E, 4=F(Airwaves/Fatshark), 5=Raceband - uint8_t channel; // 1-8 - uint8_t power; // 0 = lowest - uint16_t freq; // sets freq in MHz if band=0 -} vtxSettingsConfig_t; - -PG_DECLARE(vtxSettingsConfig_t, vtxSettingsConfig); - -void vtxSettingsSaveBandAndChannel(uint8_t band, uint8_t channel); -void vtxSettingsSavePowerByIndex(uint8_t index); -void vtxSettingsSaveBandChanAndPower(uint8_t band, uint8_t channel, uint8_t index); -void vtxSettingsSaveFrequency(uint16_t freq); -void vtxSettingsSaveFreqAndPower(uint16_t freq, uint8_t index); - -#endif //VTX_SETTINGS_CONFIG diff --git a/src/main/io/vtx_smartaudio.c b/src/main/io/vtx_smartaudio.c index dc8d2a663..9856845a9 100644 --- a/src/main/io/vtx_smartaudio.c +++ b/src/main/io/vtx_smartaudio.c @@ -51,8 +51,8 @@ #include "io/serial.h" #include "io/vtx_control.h" +#include "io/vtx.h" #include "io/vtx_smartaudio.h" -#include "io/vtx_settings_config.h" #include "io/vtx_string.h" //#define SMARTAUDIO_DPRINTF @@ -262,7 +262,7 @@ static void saAutobaud(void) // Transport level variables -static uint32_t sa_lastTransmission = 0; +static timeUs_t sa_lastTransmission = 0; static uint8_t sa_outstanding = SA_CMD_NONE; // Outstanding command static uint8_t sa_osbuf[32]; // Outstanding comamnd frame for retransmission static int sa_oslen; // And associate length @@ -336,7 +336,7 @@ static void saProcessResponse(uint8_t *buf, int len) } if (memcmp(&saDevice, &saDevicePrev, sizeof(smartAudioDevice_t))) { -#ifdef CMS //if changes then trigger saCms update +#ifdef USE_CMS //if changes then trigger saCms update saCmsResetOpmodel(); #endif #ifdef SMARTAUDIO_DPRINTF // Debug @@ -594,7 +594,6 @@ static void saDevSetFreq(uint16_t freq) void saSetFreq(uint16_t freq) { saDevSetFreq(freq); - vtxSettingsSaveFrequency(freq); } void saSetPitFreq(uint16_t freq) @@ -628,7 +627,6 @@ static void saDevSetBandAndChannel(uint8_t band, uint8_t channel) void saSetBandAndChannel(uint8_t band, uint8_t channel) { saDevSetBandAndChannel(band, channel); - vtxSettingsSaveBandAndChannel(band + 1, channel + 1); } void saSetMode(int mode) @@ -664,38 +662,6 @@ static void saDevSetPowerByIndex(uint8_t index) void saSetPowerByIndex(uint8_t index) { saDevSetPowerByIndex(index); - vtxSettingsSavePowerByIndex(index + 1); -} - -static bool saEnterInitBandChanAndPower(uint8_t band, uint8_t channel, uint8_t power) -{ - if (!saValidateBandAndChannel(band, channel)) { - return false; - } - saDevSetBandAndChannel(band - 1, channel - 1); - - uint8_t pwrIdx = constrain(power - 1, 0, VTX_SMARTAUDIO_POWER_COUNT - 1); - saDevSetPowerByIndex(pwrIdx); - - // update 'vtx_freq' via band/channel table and enter - // power-index value (in case current value is out of range) - vtxSettingsSaveFreqAndPower(vtx58_Bandchan2Freq(band, channel), pwrIdx + 1); - - return true; -} - -static void saEnterInitFreqAndPower(uint16_t freq, uint8_t power) -{ - if (saValidateFreq(freq)) { - saSetMode(0); //need to be in FREE mode to set freq - saDevSetFreq(freq); - } - - uint8_t pwrIdx = constrain(power - 1, 0, VTX_SMARTAUDIO_POWER_COUNT - 1); - saDevSetPowerByIndex(pwrIdx); - - // enter power-index value (in case current value is out of range) - vtxSettingsSavePowerByIndex(pwrIdx + 1); } bool vtxSmartAudioInit(void) @@ -731,7 +697,7 @@ bool vtxSmartAudioInit(void) return true; } -void vtxSAProcess(uint32_t now) +void vtxSAProcess(timeUs_t now) { static char initPhase = 0; static bool initSettingsDoneFlag = false; @@ -784,14 +750,6 @@ void vtxSAProcess(uint32_t now) if (!initSettingsDoneFlag) { if (saDevice.version != 0) { initSettingsDoneFlag = true; - // if vtx_band!=0 then enter 'vtx_band/chan' values (and power) - if (!saEnterInitBandChanAndPower(vtxSettingsConfig()->band, - vtxSettingsConfig()->channel, vtxSettingsConfig()->power)) { - // if vtx_band==0 then enter 'vtx_freq' value (and power) - if (vtxSettingsConfig()->band == 0) { - saEnterInitFreqAndPower(vtxSettingsConfig()->freq, vtxSettingsConfig()->power); - } - } } else if (now - sa_lastTransmission >= 100) { // device is not ready; repeat query saGetSettings(); diff --git a/src/main/io/vtx_tramp.c b/src/main/io/vtx_tramp.c index e1e13c33e..7ecb4a7ec 100644 --- a/src/main/io/vtx_tramp.c +++ b/src/main/io/vtx_tramp.c @@ -37,8 +37,8 @@ #include "io/serial.h" #include "io/vtx_tramp.h" -#include "io/vtx_settings_config.h" #include "io/vtx_control.h" +#include "io/vtx.h" #include "io/vtx_string.h" #if defined(USE_CMS) || defined(VTX_COMMON) @@ -149,7 +149,6 @@ void trampSetFreq(uint16_t freq) { trampSetByFreqFlag = true; //set freq via MHz value trampDevSetFreq(freq); - vtxSettingsSaveFrequency(freq); } void trampSendFreq(uint16_t freq) @@ -367,41 +366,9 @@ void trampQueryS(void) trampQuery('s'); } -static bool trampEnterInitBandChanAndPower(uint8_t band, uint8_t channel, uint8_t power) +void vtxTrampProcess(timeUs_t currentTimeUs) { - if (!trampValidateBandAndChannel(band, channel)) { - return false; - } - trampSetByFreqFlag = false; //set freq via band/channel - trampDevSetBandAndChannel(band, channel); - - uint8_t pwrIdx = constrain(power, 1, sizeof(trampPowerTable)); - trampDevSetPowerByIndex(pwrIdx); - - // update 'vtx_freq' via band/channel table and enter - // power-index value (in case current value is out of range) - vtxSettingsSaveFreqAndPower(vtx58_Bandchan2Freq(band, channel), pwrIdx); - - return true; -} - -static void trampEnterInitFreqAndPower(uint16_t freq, uint8_t power) -{ - if (trampValidateFreq(freq)) { - trampSetByFreqFlag = true; //set freq via MHz value - trampDevSetFreq(freq); - } - - uint8_t pwrIdx = constrain(power, 1, sizeof(trampPowerTable)); - trampDevSetPowerByIndex(pwrIdx); - - // enter power-index value (in case current value is out of range) - vtxSettingsSavePowerByIndex(pwrIdx); -} - -void vtxTrampProcess(uint32_t currentTimeUs) -{ - static uint32_t lastQueryTimeUs = 0; + static timeUs_t lastQueryTimeUs = 0; static bool initSettingsDoneFlag = false; #ifdef TRAMP_DEBUG @@ -428,13 +395,6 @@ void vtxTrampProcess(uint32_t currentTimeUs) if (!initSettingsDoneFlag) { initSettingsDoneFlag = true; // if vtx_band!=0 then enter 'vtx_band/chan' values (and power) - if (!trampEnterInitBandChanAndPower(vtxSettingsConfig()->band, vtxSettingsConfig()->channel, - vtxSettingsConfig()->power)) { - // if vtx_band=0 then enter 'vtx_freq' value (and power) - if (vtxSettingsConfig()->band == 0) { - trampEnterInitFreqAndPower(vtxSettingsConfig()->freq, vtxSettingsConfig()->power); - } - } } } break; @@ -544,15 +504,12 @@ void vtxTrampSetBandAndChannel(uint8_t band, uint8_t channel) if (trampValidateBandAndChannel(band, channel)) { trampSetBandAndChannel(band, channel); trampCommitChanges(); - vtxSettingsSaveBandAndChannel(band, channel); } } void vtxTrampSetPowerByIndex(uint8_t index) { - if (trampDevSetPowerByIndex(index)) { - vtxSettingsSavePowerByIndex(index); - } + trampDevSetPowerByIndex(index); } void vtxTrampSetPitMode(uint8_t onoff) @@ -639,7 +596,7 @@ bool vtxTrampInit(void) serialPortConfig_t *portConfig = findSerialPortConfig(FUNCTION_VTX_TRAMP); if (portConfig) { - portOptions_e portOptions = 0; + portOptions_e portOptions = 0; #if defined(VTX_COMMON) portOptions = portOptions | (vtxConfig()->halfDuplex ? SERIAL_BIDIR : SERIAL_UNIDIR); #else diff --git a/src/main/rx/spektrum.c b/src/main/rx/spektrum.c index b80d7db91..e5743e7da 100644 --- a/src/main/rx/spektrum.c +++ b/src/main/rx/spektrum.c @@ -34,6 +34,7 @@ #include "drivers/vtx_common.h" #include "io/serial.h" +#include "io/vtx_string.h" #include "fc/config.h" #include "fc/fc_dispatch.h" @@ -258,40 +259,60 @@ const uint8_t vtxTrampPi[] = { // Spektrum Spec Tx menu Tx sends vtx.band = (vtxControl & SPEKTRUM_VTX_BAND_MASK) >> SPEKTRUM_VTX_BAND_SHIFT; vtx.channel = (vtxControl & SPEKTRUM_VTX_CHANNEL_MASK) >> SPEKTRUM_VTX_CHANNEL_SHIFT; + const vtxSettingsConfig_t prevSettings = { + .band = vtxSettingsConfig()->band, + .channel = vtxSettingsConfig()->channel, + .freq = vtxSettingsConfig()->freq, + .power = vtxSettingsConfig()->power, + }; + vtxSettingsConfig_t newSettings = prevSettings; + #ifdef USE_VTX_COMMON_FREQ_API uint16_t freq = SpektrumVtxfrequencyTable[vtx.band][vtx.channel]; - uint16_t currentFreq = 0; - vtxCommonGetFrequency(¤tFreq); - if (currentFreq != freq) { - vtxCommonSetBandAndChannel(VTX_COMMON_BAND_USER, vtx.channel); - vtxCommonSetFrequency(freq); + if (vtxCommonDeviceRegistered()) { + if (prevSettings.freq != freq) { + newSettings.band = VTX_COMMON_BAND_USER; + newSettings.channel = vtx.channel; + newSettings.freq = freq; + } } #else // Convert to the internal Common Band index uint8_t band = spek2commonBand[vtx.band]; uint8_t channel = vtx.channel +1; // 0 based to 1 based - - uint8_t currentBand = 0, currentChannel = 0; - vtxCommonGetBandAndChannel(¤tBand, ¤tChannel); - if ((currentBand != band) || (currentChannel != channel)) { - vtxCommonSetBandAndChannel(band, channel); + if (vtxCommonDeviceRegistered()) { + if ((prevSettings.band != band) || (prevSettings.channel != channel)) { + newSettings.band = band; + newSettings.channel = channel; + newSettings.freq = vtx58_Bandchan2Freq(band, channel); + } } #endif // Seems to be no unified internal VTX API std for popwer levels/indexes, VTX device brand specific. uint8_t power = convertSpektrumVtxPowerIndex(vtx.power); - uint8_t currentPower = 0; - vtxCommonGetPowerIndex(¤tPower); - if (currentPower != power) { - vtxCommonSetPowerByIndex(power); + if (vtxCommonDeviceRegistered()) { + if (prevSettings.power != power) { + newSettings.power = power; + } } // Everyone seems to agree on what PIT ON/OFF means uint8_t currentPitMode = 0; - vtxCommonGetPitMode(¤tPitMode); - if (currentPitMode != vtx.pitMode) { - vtxCommonSetPitMode(vtx.pitMode); + if (vtxCommonDeviceRegistered()) { + vtxCommonGetPitMode(¤tPitMode); + if (currentPitMode != vtx.pitMode) { + vtxCommonSetPitMode(vtx.pitMode); + } + } + + if(memcmp(&prevSettings,&newSettings,sizeof(vtxSettingsConfig_t))) { + vtxSettingsConfigMutable()->band = newSettings.band; + vtxSettingsConfigMutable()->channel = newSettings.channel; + vtxSettingsConfigMutable()->power = newSettings.power; + vtxSettingsConfigMutable()->freq = newSettings.freq; + saveConfigAndNotify(); } } @@ -383,7 +404,7 @@ static uint8_t spektrumFrameStatus(void) uint16_t fade; uint8_t system; - // Get fade count, different format depending on Rx rype and how Rx is bound. Initially assumed Internal + // Get fade count, different format depending on Rx rype and how Rx is bound. Initially assumed Internal if (spektrumSatInternal) { // Internal Rx, bind values 3, 5, 7, 9 fade = (uint16_t) spekFrame[0]; diff --git a/src/main/target/STM32F3DISCOVERY/target.h b/src/main/target/STM32F3DISCOVERY/target.h index cdd6f25b2..cd0a26ce2 100644 --- a/src/main/target/STM32F3DISCOVERY/target.h +++ b/src/main/target/STM32F3DISCOVERY/target.h @@ -185,7 +185,6 @@ #define LSM303DLHC_I2C_INT1_PIN PE4 #define LSM303DLHC_I2C_INT2_PIN PE5 - #define USE_ADC #define ADC_INSTANCE ADC1 #define VBAT_ADC_PIN PC0 diff --git a/src/test/unit/cli_unittest.cc b/src/test/unit/cli_unittest.cc index 34f70c81f..73c1540ca 100644 --- a/src/test/unit/cli_unittest.cc +++ b/src/test/unit/cli_unittest.cc @@ -34,6 +34,8 @@ extern "C" { #include "config/parameter_group_ids.h" #include "sensors/battery.h" #include "drivers/buf_writer.h" + #include "drivers/vtx_common.h" + #include "io/vtx.h" #include "flight/mixer.h" #include "flight/servos.h" #include "flight/pid.h"