diff --git a/src/main/drivers/vtx_common.h b/src/main/drivers/vtx_common.h index 634b5f1846..39cd019f37 100644 --- a/src/main/drivers/vtx_common.h +++ b/src/main/drivers/vtx_common.h @@ -33,9 +33,11 @@ #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_DEFAULT_BAND 4 +#define VTX_SETTINGS_DEFAULT_CHANNEL 1 +#define VTX_SETTINGS_DEFAULT_FREQ 5740 +#define VTX_SETTINGS_DEFAULT_PITMODE_FREQ 0 +#define VTX_SETTINGS_DEFAULT_LOW_POWER_DISARM 0 #define VTX_SETTINGS_MAX_FREQUENCY_MHZ 5999 //max freq (in MHz) for 'vtx_freq' setting @@ -44,6 +46,8 @@ #define VTX_SETTINGS_POWER_COUNT 5 #define VTX_SETTINGS_DEFAULT_POWER 1 #define VTX_SETTINGS_MIN_POWER 0 +#define VTX_SETTINGS_MIN_USER_FREQ 5000 +#define VTX_SETTINGS_MAX_USER_FREQ 5999 #define VTX_SETTINGS_FREQCMD #elif defined(VTX_RTC6705) diff --git a/src/main/fc/rc_modes.h b/src/main/fc/rc_modes.h index d4455e08fa..8c1d957826 100644 --- a/src/main/fc/rc_modes.h +++ b/src/main/fc/rc_modes.h @@ -61,6 +61,7 @@ typedef enum { BOXPREARM, BOXBEEPGPSCOUNT, BOX3DONASWITCH, + BOXVTXPITMODE, CHECKBOX_ITEM_COUNT } boxId_e; diff --git a/src/main/interface/msp_box.c b/src/main/interface/msp_box.c index e0b6ac8104..e70866923c 100644 --- a/src/main/interface/msp_box.c +++ b/src/main/interface/msp_box.c @@ -81,7 +81,7 @@ static const box_t boxes[CHECKBOX_ITEM_COUNT] = { { BOXPREARM, "PREARM", 36 }, { BOXBEEPGPSCOUNT, "BEEP GPS SATELLITE COUNT", 37 }, { BOX3DONASWITCH, "3D ON A SWITCH", 38 }, - + { BOXVTXPITMODE, "VTX PIT MODE", 39 }, }; // mask of enabled IDs, calculated on startup based on enabled features. boxId_e is used as bit index @@ -256,6 +256,10 @@ void initActiveBoxIds(void) BME(BOXCAMERA3); #endif +#if defined(VTX_SMARTAUDIO) || defined(VTX_TRAMP) + BME(BOXVTXPITMODE); +#endif + #undef BME // check that all enabled IDs are in boxes array (check may be skipped when using findBoxById() functions) for (boxId_e boxId = 0; boxId < CHECKBOX_ITEM_COUNT; boxId++) @@ -296,7 +300,8 @@ int packFlightModeFlags(boxBitmask_t *mspFlightModeFlags) const uint64_t rcModeCopyMask = BM(BOXHEADADJ) | BM(BOXCAMSTAB) | BM(BOXCAMTRIG) | BM(BOXBEEPERON) | BM(BOXLEDMAX) | BM(BOXLEDLOW) | BM(BOXLLIGHTS) | BM(BOXCALIB) | BM(BOXGOV) | BM(BOXOSD) | BM(BOXTELEMETRY) | BM(BOXGTUNE) | BM(BOXBLACKBOX) | BM(BOXBLACKBOXERASE) | BM(BOXAIRMODE) - | BM(BOXANTIGRAVITY) | BM(BOXFPVANGLEMIX) | BM(BOXFLIPOVERAFTERCRASH) | BM(BOX3DDISABLE) | BM(BOXBEEPGPSCOUNT); + | BM(BOXANTIGRAVITY) | BM(BOXFPVANGLEMIX) | BM(BOXFLIPOVERAFTERCRASH) | BM(BOX3DDISABLE) + | BM(BOXBEEPGPSCOUNT) | BM(BOXVTXPITMODE); STATIC_ASSERT(sizeof(rcModeCopyMask) * 8 >= CHECKBOX_ITEM_COUNT, copy_mask_too_small_for_boxes); for (unsigned i = 0; i < CHECKBOX_ITEM_COUNT; i++) { if ((rcModeCopyMask & BM(i)) // mode copy is enabled diff --git a/src/main/interface/settings.c b/src/main/interface/settings.c index 53f3c8496b..e8ce4c5792 100644 --- a/src/main/interface/settings.c +++ b/src/main/interface/settings.c @@ -764,6 +764,7 @@ const clivalue_t valueTable[] = { { "vtx_low_power_disarm", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, lowPowerDisarm) }, #ifdef VTX_SETTINGS_FREQCMD { "vtx_freq", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, VTX_SETTINGS_MAX_FREQUENCY_MHZ }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, freq) }, + { "vtx_pit_mode_freq", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, VTX_SETTINGS_MAX_FREQUENCY_MHZ }, PG_VTX_SETTINGS_CONFIG, offsetof(vtxSettingsConfig_t, pitModeFreq) }, #endif #endif diff --git a/src/main/io/vtx.c b/src/main/io/vtx.c index a0fab8881d..f3884e1a8a 100644 --- a/src/main/io/vtx.c +++ b/src/main/io/vtx.c @@ -23,6 +23,7 @@ #if defined(VTX_COMMON) #include "common/time.h" +#include "common/maths.h" #include "config/parameter_group.h" #include "config/parameter_group_ids.h" @@ -31,6 +32,7 @@ #include "fc/config.h" #include "fc/runtime_config.h" +#include "fc/rc_modes.h" #include "io/vtx.h" #include "io/vtx_string.h" @@ -43,7 +45,8 @@ PG_RESET_TEMPLATE(vtxSettingsConfig_t, vtxSettingsConfig, .channel = VTX_SETTINGS_DEFAULT_CHANNEL, .power = VTX_SETTINGS_DEFAULT_POWER, .freq = VTX_SETTINGS_DEFAULT_FREQ, - .lowPowerDisarm = 0, + .pitModeFreq = VTX_SETTINGS_DEFAULT_PITMODE_FREQ, + .lowPowerDisarm = VTX_SETTINGS_DEFAULT_LOW_POWER_DISARM, ); #define VTX_PARAM_CYCLE_TIME_US 100000 // 10Hz @@ -51,6 +54,7 @@ PG_RESET_TEMPLATE(vtxSettingsConfig_t, vtxSettingsConfig, typedef enum { VTX_PARAM_BANDCHAN = 0, VTX_PARAM_POWER, + VTX_PARAM_PITMODE, VTX_PARAM_CONFIRM, VTX_PARAM_COUNT } vtxScheduleParams_e; @@ -61,27 +65,70 @@ static uint8_t vtxParamSchedule[VTX_PARAM_COUNT]; void vtxInit(void) { uint8_t index = 0; + bool settingsUpdated = false; + vtxParamSchedule[index++] = VTX_PARAM_BANDCHAN; vtxParamSchedule[index++] = VTX_PARAM_POWER; + vtxParamSchedule[index++] = VTX_PARAM_PITMODE; vtxParamSchedule[index++] = VTX_PARAM_CONFIRM; - 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; + settingsUpdated = true; + } + +#if defined(VTX_SETTINGS_FREQCMD) + // constrain pit mode frequency + if (vtxSettingsConfig()->pitModeFreq) { + const uint16_t constrainedPitModeFreq = MAX(vtxSettingsConfig()->pitModeFreq, VTX_SETTINGS_MIN_USER_FREQ); + if (constrainedPitModeFreq != vtxSettingsConfig()->pitModeFreq) { + vtxSettingsConfigMutable()->pitModeFreq = constrainedPitModeFreq; + settingsUpdated = true; + } + } +#endif + + if (settingsUpdated) { saveConfigAndNotify(); } } +static vtxSettingsConfig_t vtxGetSettings(void) { + vtxSettingsConfig_t settings = { + .band = vtxSettingsConfig()->band, + .channel = vtxSettingsConfig()->channel, + .power = vtxSettingsConfig()->power, + .freq = vtxSettingsConfig()->freq, + .pitModeFreq = vtxSettingsConfig()->pitModeFreq, + .lowPowerDisarm = vtxSettingsConfig()->lowPowerDisarm, + }; + +#if defined(VTX_SETTINGS_FREQCMD) + if (IS_RC_MODE_ACTIVE(BOXVTXPITMODE) && isModeActivationConditionPresent(BOXVTXPITMODE) && settings.pitModeFreq) { + settings.band = 0; + settings.freq = settings.pitModeFreq; + settings.power = VTX_SETTINGS_DEFAULT_POWER; + } +#endif + + if (!ARMING_FLAG(ARMED) && settings.lowPowerDisarm) { + settings.power = VTX_SETTINGS_DEFAULT_POWER; + } + + return settings; +} + static bool vtxProcessBandAndChannel(void) { if(!ARMING_FLAG(ARMED)) { uint8_t vtxBand; uint8_t vtxChan; if (vtxCommonGetBandAndChannel(&vtxBand, &vtxChan)) { - if (vtxSettingsConfig()->band != vtxBand || vtxSettingsConfig()->channel != vtxChan) { - vtxCommonSetBandAndChannel(vtxSettingsConfig()->band, vtxSettingsConfig()->channel); + const vtxSettingsConfig_t settings = vtxGetSettings(); + if (vtxBand != settings.band || vtxChan != settings.channel) { + vtxCommonSetBandAndChannel(settings.band, settings.channel); return true; } } @@ -94,8 +141,9 @@ static bool vtxProcessFrequency(void) { if(!ARMING_FLAG(ARMED)) { uint16_t vtxFreq; if (vtxCommonGetFrequency(&vtxFreq)) { - if (vtxSettingsConfig()->freq != vtxFreq) { - vtxCommonSetFrequency(vtxSettingsConfig()->freq); + const vtxSettingsConfig_t settings = vtxGetSettings(); + if (vtxFreq != settings.freq) { + vtxCommonSetFrequency(settings.freq); return true; } } @@ -106,29 +154,43 @@ static bool vtxProcessFrequency(void) { static bool vtxProcessPower(void) { uint8_t vtxPower; - uint8_t newPower; if (vtxCommonGetPowerIndex(&vtxPower)) { - if (!ARMING_FLAG(ARMED) && vtxSettingsConfig()->lowPowerDisarm) { - newPower = VTX_SETTINGS_DEFAULT_POWER; - } else { - newPower = vtxSettingsConfig()->power; - } - if (vtxPower != newPower) { - vtxCommonSetPowerByIndex(newPower); + const vtxSettingsConfig_t settings = vtxGetSettings(); + if (vtxPower != settings.power) { + vtxCommonSetPowerByIndex(settings.power); return true; } } return false; } +static bool vtxProcessPitMode(void) { + uint8_t pitOnOff; + if (!ARMING_FLAG(ARMED) && vtxCommonGetPitMode(&pitOnOff)) { + if (IS_RC_MODE_ACTIVE(BOXVTXPITMODE)) { +#if defined(VTX_SETTINGS_FREQCMD) + if (vtxSettingsConfig()->pitModeFreq) { + return false; + } +#endif + if (isModeActivationConditionPresent(BOXVTXPITMODE)) { + if (!pitOnOff) { + vtxCommonSetPitMode(true); + return true; + } + } else { + if (pitOnOff) { + vtxCommonSetPitMode(false); + return true; + } + } + } + } + return false; +} + static bool vtxProcessStateUpdate(void) { - const vtxSettingsConfig_t vtxSettingsState = { - .band = vtxSettingsConfig()->band, - .channel = vtxSettingsConfig()->channel, - .power = vtxSettingsConfig()->power, - .freq = vtxSettingsConfig()->freq, - .lowPowerDisarm = vtxSettingsConfig()->lowPowerDisarm, - }; + const vtxSettingsConfig_t vtxSettingsState = vtxGetSettings(); vtxSettingsConfig_t vtxState = vtxSettingsState; if (vtxSettingsState.band) { @@ -152,11 +214,12 @@ void vtxProcessSchedule(timeUs_t currentTimeUs) if (vtxCommonDeviceRegistered()) { const uint8_t currentSchedule = vtxParamSchedule[scheduleIndex]; + const vtxSettingsConfig_t settings = vtxGetSettings(); // 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) { + if (settings.band) { vtxUpdatePending = vtxProcessBandAndChannel(); #if defined(VTX_SETTINGS_FREQCMD) } else { @@ -167,6 +230,9 @@ void vtxProcessSchedule(timeUs_t currentTimeUs) case VTX_PARAM_POWER: vtxUpdatePending = vtxProcessPower(); break; + case VTX_PARAM_PITMODE: + vtxUpdatePending = vtxProcessPitMode(); + break; case VTX_PARAM_CONFIRM: vtxUpdatePending = vtxProcessStateUpdate(); break; diff --git a/src/main/io/vtx.h b/src/main/io/vtx.h index 3673c59efe..0e5a3c836b 100644 --- a/src/main/io/vtx.h +++ b/src/main/io/vtx.h @@ -24,11 +24,12 @@ #include "config/parameter_group.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 - uint8_t lowPowerDisarm; // min power while disarmed + 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 + uint16_t pitModeFreq; // sets out-of-range pitmode frequency + uint8_t lowPowerDisarm; // min power while disarmed } vtxSettingsConfig_t; PG_DECLARE(vtxSettingsConfig_t, vtxSettingsConfig); diff --git a/src/main/target/RCEXPLORERF3/target.h b/src/main/target/RCEXPLORERF3/target.h index 6ede4690f6..ea7d042db7 100644 --- a/src/main/target/RCEXPLORERF3/target.h +++ b/src/main/target/RCEXPLORERF3/target.h @@ -107,7 +107,6 @@ #define USE_GPS #define USE_GPS_UBLOX #define USE_GPS_NMEA -#define USE_NAV #define USE_SERIAL_4WAY_BLHELI_INTERFACE