Skip to content

Commit b2b5307

Browse files
hexfetTheRealMoeder
authored andcommitted
Improve "Tx power" user interface (#613)
* First pass at Tx power improvements * Default to radio max power if value in model file is not recognized. Fix off by one error. * Set Tx power to maximum when changing protocols. * Adjust R9M power strings to fit display box. * Fix lint errors. * Reduce number of const strings * Clean up warnings * Reduce ROM string usage by creating on demand. * Fix linter complaint * Revert "Reduce ROM string usage by creating on demand." This reverts commit 7163e44. * Fix lint complaint
1 parent a98ce05 commit b2b5307

11 files changed

Lines changed: 69 additions & 32 deletions

File tree

src/common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ int PROTOCOL_SetSwitch(int module);
174174
int PROTOCOL_SticksMoved(int init);
175175
void PROTOCOL_InitModules();
176176
void PROTOCOL_ResetTelemetry();
177+
enum Radio PROTOCOL_GetRadio(u16 idx);
177178

178179

179180
/* Input */

src/config/model.c

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,39 @@ struct Model Model;
2929
static u32 crc32;
3030

3131
const char * const MODEL_TYPE_VAL[MODELTYPE_LAST] = { "heli", "plane", "multi" };
32-
const char * const RADIO_TX_POWER_VAL[TXPOWER_LAST] =
33-
{ "100uW", "300uW", "1mW", "3mW", "10mW", "30mW", "100mW", "150mW" };
32+
const u8 RADIO_TX_POWER_COUNT[TX_MODULE_LAST] = { // number of power settings
33+
8, // CYRF6936,
34+
7, // A7105,
35+
8, // CC2500,
36+
4, // NRF24L01,
37+
8, // MULTIMOD,
38+
4, // R9M (FCC/EU),
39+
};
40+
41+
const char * radio_tx_power_val(enum Radio radio, enum TxPower power) {
42+
// entries in this list must match order in enum TxPower definition
43+
static const char * const std_powers[TXPOWER_LAST] = {
44+
"100uW", "300uW", "1mW", "3mW", "10mW", "30mW", "100mW", "150mW"};
45+
static const char * const nrf_powers[] = { "1mW", "6mW", "25mW", "100mW"};
46+
static const char * const r9m_powers[] = { "10/25mW", "100/25mW", "500/500", "Auto/200" };
47+
48+
if (radio >= TX_MODULE_LAST) return NULL;
49+
if (power >= RADIO_TX_POWER_COUNT[radio]) power = RADIO_TX_POWER_COUNT[radio]-1;
50+
51+
switch (radio) {
52+
case CYRF6936:
53+
case CC2500:
54+
case A7105:
55+
case MULTIMOD:
56+
return std_powers[power];
57+
case NRF24L01:
58+
return nrf_powers[power];
59+
case R9M:
60+
return r9m_powers[power];
61+
default:
62+
return NULL; // never reached, silence warning
63+
}
64+
}
3465

3566
#define MATCH_SECTION(s) (strcasecmp(section, s) == 0)
3667
#define MATCH_START(x,y) (strncasecmp(x, y, sizeof(y)-1) == 0)
@@ -662,6 +693,7 @@ int assign_int(void* ptr, const struct struct_map *map, int map_size)
662693
for (i = 0; i < PROTOCOL_COUNT; i++) {
663694
if (MATCH_VALUE(PROTOCOL_GetName(i))) {
664695
m->protocol = i;
696+
m->radio = PROTOCOL_GetRadio(i);
665697
PROTOCOL_Load(1);
666698
return 1;
667699
}
@@ -672,13 +704,18 @@ int assign_int(void* ptr, const struct struct_map *map, int map_size)
672704
if(assign_int(&Model, _secradio, MAPSIZE(_secradio)))
673705
return 1;
674706
if (MATCH_KEY(RADIO_TX_POWER)) {
675-
for (i = 0; i < NUM_STR_ELEMS(RADIO_TX_POWER_VAL); i++) {
676-
if (MATCH_VALUE(RADIO_TX_POWER_VAL[i])) {
707+
if (m->radio == TX_MODULE_LAST) {
708+
m->tx_power = TXPOWER_150mW;
709+
return 1;
710+
}
711+
for (i = 0; i < RADIO_TX_POWER_COUNT[m->radio]; i++) {
712+
if (MATCH_VALUE(radio_tx_power_val(m->radio, i))) {
677713
m->tx_power = i;
678714
return 1;
679715
}
680716
}
681717
printf("Unknown Tx power: %s\n", value);
718+
m->tx_power = RADIO_TX_POWER_COUNT[m->radio]-1; // default to radio maximum
682719
return 1;
683720
}
684721
printf("Unknown Radio Key: %s\n", name);
@@ -1210,7 +1247,7 @@ u8 CONFIG_WriteModel(u8 model_num) {
12101247
fprintf(fh, "[%s]\n", SECTION_RADIO);
12111248
fprintf(fh, "%s=%s\n", RADIO_PROTOCOL, PROTOCOL_GetName(m->protocol));
12121249
write_int(fh, m, _secradio, MAPSIZE(_secradio));
1213-
fprintf(fh, "%s=%s\n", RADIO_TX_POWER, RADIO_TX_POWER_VAL[m->tx_power]);
1250+
fprintf(fh, "%s=%s\n", RADIO_TX_POWER, radio_tx_power_val(m->radio, m->tx_power));
12141251
fprintf(fh, "\n");
12151252
write_proto_opts(fh, m);
12161253
struct Limit default_limit;

src/config/model.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ struct Model {
3737
u16 ppmin_centerpw;
3838
u16 ppmin_deltapw;
3939
u8 train_sw;
40+
enum Radio radio;
4041
enum TxPower tx_power;
4142
enum SwashType swash_type;
4243
u8 swash_invert;
@@ -78,7 +79,8 @@ struct Model {
7879
#endif
7980
};
8081
extern struct Model Model;
81-
extern const char * const RADIO_TX_POWER_VAL[TXPOWER_LAST];
82+
const char * radio_tx_power_val(enum Radio, enum TxPower);
83+
extern const u8 RADIO_TX_POWER_COUNT[TX_MODULE_LAST];
8284

8385
u8 CONFIG_ReadModel(u8 model_num);
8486
u8 CONFIG_WriteModel(u8 model_num);

src/pages/128x64x1/range_page.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ static void _draw_page(int has_pa) {
4848
PAGE_SetActionCB(action_cb);
4949
if (mp->testing) {
5050
snprintf(tempstring, sizeof(tempstring), "%s %s\n%s %s\n%s",
51-
_tr("Power reduced to"), RADIO_TX_POWER_VAL[Model.tx_power],
52-
_tr("from"), RADIO_TX_POWER_VAL[mp->old_power],
51+
_tr("Power reduced to"), radio_tx_power_val(Model.radio, Model.tx_power),
52+
_tr("from"), radio_tx_power_val(Model.radio, mp->old_power),
5353
_tr("Press ENT to stop test."));
5454
} else {
5555
snprintf(tempstring, sizeof(tempstring),

src/pages/320x240x16/range_page.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ static void _draw_page(int has_pa) {
4646
(void *)(long)mp->testing);
4747
if (mp->testing) {
4848
snprintf(tempstring, sizeof(tempstring), "%s %s %s %s.",
49-
_tr("Power reduced to"), RADIO_TX_POWER_VAL[Model.tx_power],
50-
_tr("from"), RADIO_TX_POWER_VAL[mp->old_power]);
49+
_tr("Power reduced to"), radio_tx_power_val(Model.radio, Model.tx_power),
50+
_tr("from"), radio_tx_power_val(Model.radio, mp->old_power));
5151
GUI_CreateLabelBox(&gui->info, INFO_X, INFO_Y, 0, 0, &DEFAULT_FONT,
5252
NULL, NULL, tempstring);
5353
}

src/pages/common/_main_page.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct ImageMap TGLICO_GetImage(int idx);
4040
*/
4141
static const char *_power_to_string()
4242
{
43-
return RADIO_TX_POWER_VAL[Model.tx_power];
43+
return radio_tx_power_val(Model.radio, Model.tx_power);
4444
}
4545

4646
struct LabelDesc *get_box_font(u8 idx, u8 neg)

src/pages/common/_model_page.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ static const char *powerselect_cb(guiObject_t *obj, int dir, void *data)
179179
(void)obj;
180180
if(! PROTOCOL_HasPowerAmp(Model.protocol))
181181
return _tr("Default");
182-
Model.tx_power = GUI_TextSelectHelper(Model.tx_power, TXPOWER_100uW, TXPOWER_LAST-1, dir, 1, 1, NULL);
182+
Model.tx_power = GUI_TextSelectHelper(Model.tx_power, TXPOWER_100uW, RADIO_TX_POWER_COUNT[Model.radio]-1, dir, 1, 1, NULL);
183183
mp->last_txpower = Model.tx_power;
184-
return RADIO_TX_POWER_VAL[Model.tx_power];
184+
return radio_tx_power_val(Model.radio, Model.tx_power);
185185
}
186186

187187
static const char *ppmin_select_cb(guiObject_t *obj, int dir, void *data)
@@ -249,12 +249,10 @@ static const char *protoselect_cb(guiObject_t *obj, int dir, void *data)
249249
PROTOCOL_DeInit();
250250
// Load() the new protocol
251251
Model.protocol = new_protocol;
252+
Model.radio = PROTOCOL_GetRadio(new_protocol);
253+
Model.tx_power = RADIO_TX_POWER_COUNT[Model.radio]-1;
252254
PROTOCOL_Load(1);
253255
Model.num_channels = PROTOCOL_DefaultNumChannels();
254-
if (! PROTOCOL_HasPowerAmp(Model.protocol))
255-
Model.tx_power = TXPOWER_150mW;
256-
else
257-
Model.tx_power = mp->last_txpower;
258256
memset(Model.proto_opts, 0, sizeof(Model.proto_opts));
259257
guiObject_t *obj = _get_obj(ITEM_NUMCHAN, 0);
260258
if (obj)

src/protocol/protocol.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ const struct{
7171
#else
7272
#define PROTODEF(proto, module, map, cmd, name) {module, cmd, name},
7373
const struct{
74-
int module;
74+
enum Radio module;
7575
const void * (*cmd)(enum ProtoCmds);
7676
const char* name;
7777
}Protocols[PROTOCOL_COUNT] = {
@@ -91,6 +91,10 @@ const char * PROTOCOL_GetName(u16 idx)
9191
return Protocols[idx].name;
9292
}
9393

94+
enum Radio PROTOCOL_GetRadio(u16 idx) {
95+
return (enum Radio)get_module(idx);
96+
}
97+
9498
const char * PROTOCOL_Name()
9599
{
96100
return PROTOCOL_GetName(Model.protocol);
@@ -425,6 +429,7 @@ int PROTOCOL_HasModule(int idx)
425429
} else {
426430
#endif
427431
int m = get_module(idx);
432+
if (m > MULTIMOD) return 1; // last internal module
428433
if(m == TX_MODULE_LAST || Transmitter.module_enable[m].port != 0)
429434
return 1;
430435
return 0;
@@ -441,11 +446,8 @@ int PROTOCOL_HasPowerAmp(int idx)
441446
} else {
442447
#endif
443448
int m = get_module(idx);
444-
if ((m != TX_MODULE_LAST && Transmitter.module_poweramp & (1 << m))
445-
#ifndef ENABLE_MODULAR
446-
|| (Model.protocol == PROTOCOL_PXX)
447-
#endif
448-
)
449+
if (m != TX_MODULE_LAST && ((Transmitter.module_poweramp & (1 << m))
450+
|| (m > MULTIMOD))) // all external modules
449451
return 1;
450452
return 0;
451453
#if HAS_4IN1_FLASH

src/protocol/protocol.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ PROTODEF(PROTOCOL_USBHID, TX_MODULE_LAST, NULL, USBHID_Cmds, "USBHID")
7070

7171
PROTODEF(PROTOCOL_CRSF, TX_MODULE_LAST, NULL, CRSF_Cmds, "CRSF")
7272
PROTODEF(PROTOCOL_SBUS, TX_MODULE_LAST, NULL, SBUS_Cmds, "SBUS")
73-
PROTODEF(PROTOCOL_PXX, TX_MODULE_LAST, NULL, PXXOUT_Cmds, "PXX")
73+
PROTODEF(PROTOCOL_PXX, R9M, NULL, PXXOUT_Cmds, "PXX")
7474

7575
#ifdef BUILDTYPE_DEV
7676
PROTODEF(PROTOCOL_TESTSER, TX_MODULE_LAST, NULL, TESTSER_Cmds, "TESTSER")

src/protocol/spi/nrf24l01.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,9 @@ u8 NRF24L01_SetPower(u8 power)
201201
u8 nrf_power = 0;
202202
switch(power) {
203203
case TXPOWER_100uW: nrf_power = 0; break;
204-
case TXPOWER_300uW: nrf_power = 0; break;
205-
case TXPOWER_1mW: nrf_power = 0; break;
206-
case TXPOWER_3mW: nrf_power = 1; break;
207-
case TXPOWER_10mW: nrf_power = 1; break;
208-
case TXPOWER_30mW: nrf_power = 2; break;
209-
case TXPOWER_100mW: nrf_power = 3; break;
210-
case TXPOWER_150mW: nrf_power = 3; break;
204+
case TXPOWER_300uW: nrf_power = 1; break;
205+
case TXPOWER_1mW: nrf_power = 2; break;
206+
case TXPOWER_3mW: nrf_power = 3; break;
211207
default: nrf_power = 0; break;
212208
}
213209
// Power is in range 0..3 for nRF24L01

0 commit comments

Comments
 (0)