@@ -29,8 +29,39 @@ struct Model Model;
2929static u32 crc32 ;
3030
3131const 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 ;
0 commit comments