vtxtable powerlevels with no parameters returns the vtxtable po… (#9122)

vtxtable powerlevels with no parameters returns the vtxtable power levels extract with SA2.1
This commit is contained in:
Michael Keller 2019-11-05 22:04:22 +13:00 committed by GitHub
commit e34ba7f534
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 95 additions and 11 deletions

View File

@ -138,13 +138,22 @@ vtxtable powerlabels 25 200 500 800
#### SmartAudio V2.1 devices vary depending on their model. Check the manufacturers website.
For these devices the `powervalues` are the output power in dBm.
To query the available power levels from a SmartAudio 2.1 VTX enter the `vtx_info` command with no parameters. This will report the available power settings thus:
```
# vtx_info
level 14 dBm, power 25 mW
level 20 dBm, power 100 mW
level 26 dBm, power 400 mW
```
For example the
[TBS Unify Pro32 Nano 5G8](https://www.team-blacksheep.com/products/prod:unifypro32_nano):
```
vtxtable powerlevels 3
vtxtable powervalues 14 20 26
vtxtable powervalues 14 20 26
vtxtable powerlabels 25 100 400
```
@ -152,7 +161,7 @@ vtxtable powerlabels 25 100 400
```
vtxtable powerlevels 3
vtxtable powervalues 13 20 26
vtxtable powervalues 13 20 26
vtxtable powerlabels 25 100 400
```
@ -168,7 +177,7 @@ vtxtable powerlabels 25 100 400 1W
```
vtxtable powerlevels 4
vtxtable powervalues 14 20 26 29
vtxtable powervalues 14 20 26 29
vtxtable powerlabels 25 100 400 800
```
@ -178,7 +187,7 @@ For example a TBS Unify EVO will also work the this config:
```
vtxtable powerlevels 2
vtxtable powervalues 20 26
vtxtable powervalues 20 26
vtxtable powerlabels .1W .4W
```

View File

@ -1598,8 +1598,8 @@ static void cliAdjustmentRange(char *cmdline)
ptr = nextArg(ptr);
if (ptr) {
val = atoi(ptr);
// Was: slot
// Keeping the parameter to retain backwards compatibility for the command format.
// Was: slot
// Keeping the parameter to retain backwards compatibility for the command format.
validArgumentCount++;
}
ptr = nextArg(ptr);
@ -2993,6 +2993,29 @@ static void cliVtxTable(char *cmdline)
cliPrintErrorLinef("INVALID SUBCOMMAND %s", tok);
}
}
static void cliVtxInfo(char *cmdline)
{
UNUSED(cmdline);
// Display the available power levels
uint16_t levels[VTX_TABLE_MAX_POWER_LEVELS];
uint16_t powers[VTX_TABLE_MAX_POWER_LEVELS];
vtxDevice_t *vtxDevice = vtxCommonDevice();
if (vtxDevice) {
uint8_t level_count = vtxCommonGetVTXPowerLevels(vtxDevice, levels, powers);
if (level_count) {
for (int i = 0; i < level_count; i++) {
cliPrintLinef("level %d dBm, power %d mW", levels[i], powers[i]);
}
} else {
cliPrintErrorLinef("NO POWER VALUES DEFINED");
}
} else {
cliPrintErrorLinef("NO VTX");
}
}
#endif // USE_VTX_TABLE
static void printName(dumpFlags_t dumpMask, const pilotConfig_t *pilotConfig)
@ -5832,7 +5855,7 @@ static void cliResource(char *cmdline)
return;
}
const char * resourceName = ownerNames[resourceTable[resourceIndex].owner];
const char * resourceName = ownerNames[resourceTable[resourceIndex].owner];
if (strncasecmp(pch, resourceName, strlen(resourceName)) == 0) {
break;
}
@ -6370,6 +6393,7 @@ const clicmd_t cmdTable[] = {
#endif
#endif
#ifdef USE_VTX_TABLE
CLI_COMMAND_DEF("vtx_info", "vtx power config dump", NULL, cliVtxInfo),
CLI_COMMAND_DEF("vtxtable", "vtx frequency table", "<band> <bandname> <bandletter> [FACTORY|CUSTOM] <freq> ... <freq>\r\n", cliVtxTable),
#endif
};

View File

@ -141,6 +141,11 @@ bool vtxCommonGetStatus(const vtxDevice_t *vtxDevice, unsigned *status)
return vtxDevice->vTable->getStatus(vtxDevice, status);
}
uint8_t vtxCommonGetVTXPowerLevels(const vtxDevice_t *vtxDevice, uint16_t *levels, uint16_t *powers)
{
return vtxDevice->vTable->getPowerLevels(vtxDevice, levels, powers);
}
const char *vtxCommonLookupBandName(const vtxDevice_t *vtxDevice, int band)
{
if (vtxDevice && band > 0 && band <= vtxTableBandCount) {

View File

@ -112,6 +112,7 @@ typedef struct vtxVTable_s {
bool (*getPowerIndex)(const vtxDevice_t *vtxDevice, uint8_t *pIndex);
bool (*getFrequency)(const vtxDevice_t *vtxDevice, uint16_t *pFreq);
bool (*getStatus)(const vtxDevice_t *vtxDevice, unsigned *status);
uint8_t (*getPowerLevels)(const vtxDevice_t *vtxDevice, uint16_t *levels, uint16_t *powers);
} vtxVTable_t;
// 3.1.0
@ -135,6 +136,7 @@ bool vtxCommonGetBandAndChannel(const vtxDevice_t *vtxDevice, uint8_t *pBand, ui
bool vtxCommonGetPowerIndex(const vtxDevice_t *vtxDevice, uint8_t *pIndex);
bool vtxCommonGetFrequency(const vtxDevice_t *vtxDevice, uint16_t *pFreq);
bool vtxCommonGetStatus(const vtxDevice_t *vtxDevice, unsigned *status);
uint8_t vtxCommonGetVTXPowerLevels(const vtxDevice_t *vtxDevice, uint16_t *levels, uint16_t *powers);
const char *vtxCommonLookupBandName(const vtxDevice_t *vtxDevice, int band);
char vtxCommonLookupBandLetter(const vtxDevice_t *vtxDevice, int band);
char vtxCommonGetBandLetter(const vtxDevice_t *vtxDevice, int band);

View File

@ -226,6 +226,15 @@ static bool vtxRTC6705GetStatus(const vtxDevice_t *vtxDevice, unsigned *status)
return false;
}
static uint8_t vtxRTC6705GetPowerLevels(const vtxDevice_t *vtxDevice, uint16_t *levels, uint16_t *powers)
{
UNUSED(vtxDevice);
UNUSED(levels);
UNUSED(powers);
return 0;
}
static vtxVTable_t rtc6705VTable = {
.process = vtxRTC6705Process,
.getDeviceType = vtxRTC6705GetDeviceType,
@ -238,6 +247,7 @@ static vtxVTable_t rtc6705VTable = {
.getPowerIndex = vtxRTC6705GetPowerIndex,
.getFrequency = vtxRTC6705GetFreq,
.getStatus = vtxRTC6705GetStatus,
.getPowerLevels = vtxRTC6705GetPowerLevels,
};
#endif // VTX_COMMON

View File

@ -23,6 +23,7 @@
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include "platform.h"
@ -127,12 +128,15 @@ static smartAudioDevice_t saDevicePrev = {
// XXX Possible compliance problem here. Need LOCK/UNLOCK menu?
static uint8_t saLockMode = SA_MODE_SET_UNLOCK; // saCms variable?
#ifdef USE_VTX_TABLE
#define VTX_SMARTAUDIO_POWER_COUNT VTX_TABLE_MAX_POWER_LEVELS
static uint8_t saSupportedNumPowerLevels = VTX_SMARTAUDIO_POWER_COUNT;
static uint16_t saSupportedPowerValues[VTX_SMARTAUDIO_POWER_COUNT];
#if !defined(USE_VTX_TABLE)
#else // USE_VTX_TABLE
#define VTX_SMARTAUDIO_POWER_COUNT 4
static char saSupportedPowerLabels[VTX_SMARTAUDIO_POWER_COUNT + 1][4] = {"---", "25 ", "200", "500", "800"};
static char *saSupportedPowerLabelPointerArray[VTX_SMARTAUDIO_POWER_COUNT + 1];
#endif
#endif // USE_VTX_TABLE
// XXX Should be configurable by user?
bool saDeferred = true; // saCms variable?
@ -1022,6 +1026,27 @@ static bool vtxSAGetStatus(const vtxDevice_t *vtxDevice, unsigned *status)
return true;
}
static uint8_t vtxSAGetPowerLevels(const vtxDevice_t *vtxDevice, uint16_t *levels, uint16_t *powers)
{
if (!vtxSAIsReady(vtxDevice) || saDevice.version < 2) {
return 0;
}
for (uint8_t i = 0; i < saSupportedNumPowerLevels; i++) {
levels[i] = saSupportedPowerValues[i];
uint16_t power = (uint16_t)pow(10.0,levels[i]/10.0);
if (levels[i] > 14) {
// For powers greater than 25mW round up to a multiple of 50 to match expectations
power = 50 * ((power + 25) / 50);
}
powers[i] = power;
}
return saSupportedNumPowerLevels;
}
static const vtxVTable_t saVTable = {
.process = vtxSAProcess,
.getDeviceType = vtxSAGetDeviceType,
@ -1034,6 +1059,7 @@ static const vtxVTable_t saVTable = {
.getPowerIndex = vtxSAGetPowerIndex,
.getFrequency = vtxSAGetFreq,
.getStatus = vtxSAGetStatus,
.getPowerLevels = vtxSAGetPowerLevels,
};
#endif // VTX_COMMON

View File

@ -35,8 +35,6 @@
#define VTX_SMARTAUDIO_MIN_CHANNEL 1
#define VTX_SMARTAUDIO_POWER_COUNT 4
#define VTX_SMARTAUDIO_MIN_FREQUENCY_MHZ 5000 //min freq in MHz
#define VTX_SMARTAUDIO_MAX_FREQUENCY_MHZ 5999 //max freq in MHz

View File

@ -593,6 +593,15 @@ static bool vtxTrampGetStatus(const vtxDevice_t *vtxDevice, unsigned *status)
return true;
}
static uint8_t vtxTrampGetPowerLevels(const vtxDevice_t *vtxDevice, uint16_t *levels, uint16_t *powers)
{
UNUSED(vtxDevice);
UNUSED(levels);
UNUSED(powers);
return 0;
}
static const vtxVTable_t trampVTable = {
.process = vtxTrampProcess,
.getDeviceType = vtxTrampGetDeviceType,
@ -605,6 +614,7 @@ static const vtxVTable_t trampVTable = {
.getPowerIndex = vtxTrampGetPowerIndex,
.getFrequency = vtxTrampGetFreq,
.getStatus = vtxTrampGetStatus,
.getPowerLevels = vtxTrampGetPowerLevels,
};
#endif