mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-09-29 06:06:38 +00:00
Merge pull request #2140 from Quency-D/cli-lna-command
Add CLI control to LoRa's fem LNA.
This commit is contained in:
@@ -263,6 +263,20 @@ This document provides an overview of CLI commands that can be sent to MeshCore
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
#### View or change the LoRa FEM receive-path gain state on supported boards
|
||||||
|
**Usage:**
|
||||||
|
- `get radio.fem.rxgain`
|
||||||
|
- `set radio.fem.rxgain <state>`
|
||||||
|
|
||||||
|
**Parameters:**
|
||||||
|
- `state`: `on`|`off`
|
||||||
|
|
||||||
|
**Notes:**
|
||||||
|
- This controls the external LoRa FEM receive-path LNA where the board supports it.
|
||||||
|
- This is separate from `radio.rxgain`, which controls the radio chip receive gain mode.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### System
|
### System
|
||||||
|
|
||||||
#### View or change this node's name
|
#### View or change this node's name
|
||||||
|
|||||||
@@ -917,6 +917,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
_prefs.rx_boosted_gain = 1; // enabled by default;
|
_prefs.rx_boosted_gain = 1; // enabled by default;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
_prefs.radio_fem_rxgain = 1;
|
||||||
|
|
||||||
pending_discover_tag = 0;
|
pending_discover_tag = 0;
|
||||||
pending_discover_until = 0;
|
pending_discover_until = 0;
|
||||||
@@ -965,6 +966,7 @@ void MyMesh::begin(FILESYSTEM *fs) {
|
|||||||
radio_driver.setRxBoostedGainMode(_prefs.rx_boosted_gain);
|
radio_driver.setRxBoostedGainMode(_prefs.rx_boosted_gain);
|
||||||
MESH_DEBUG_PRINTLN("RX Boosted Gain Mode: %s",
|
MESH_DEBUG_PRINTLN("RX Boosted Gain Mode: %s",
|
||||||
radio_driver.getRxBoostedGainMode() ? "Enabled" : "Disabled");
|
radio_driver.getRxBoostedGainMode() ? "Enabled" : "Disabled");
|
||||||
|
board.setLoRaFemLnaEnabled(_prefs.radio_fem_rxgain);
|
||||||
|
|
||||||
updateAdvertTimer();
|
updateAdvertTimer();
|
||||||
updateFloodAdvertTimer();
|
updateFloodAdvertTimer();
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ void UITask::begin(NodePrefs* node_prefs, const char* build_date, const char* fi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// v1.2.3 (1 Jan 2025)
|
// v1.2.3 (1 Jan 2025)
|
||||||
sprintf(_version_info, "%s (%s)", version, build_date);
|
snprintf(_version_info, sizeof(_version_info), "%s (%s)", version, build_date);
|
||||||
|
free(version);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UITask::renderCurrScreen() {
|
void UITask::renderCurrScreen() {
|
||||||
|
|||||||
@@ -658,6 +658,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
_prefs.gps_enabled = 0;
|
_prefs.gps_enabled = 0;
|
||||||
_prefs.gps_interval = 0;
|
_prefs.gps_interval = 0;
|
||||||
_prefs.advert_loc_policy = ADVERT_LOC_PREFS;
|
_prefs.advert_loc_policy = ADVERT_LOC_PREFS;
|
||||||
|
_prefs.radio_fem_rxgain = 1;
|
||||||
|
|
||||||
next_post_idx = 0;
|
next_post_idx = 0;
|
||||||
next_client_idx = 0;
|
next_client_idx = 0;
|
||||||
@@ -699,6 +700,7 @@ void MyMesh::begin(FILESYSTEM *fs) {
|
|||||||
|
|
||||||
radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr);
|
radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr);
|
||||||
radio_driver.setTxPower(_prefs.tx_power_dbm);
|
radio_driver.setTxPower(_prefs.tx_power_dbm);
|
||||||
|
board.setLoRaFemLnaEnabled(_prefs.radio_fem_rxgain);
|
||||||
|
|
||||||
updateAdvertTimer();
|
updateAdvertTimer();
|
||||||
updateFloodAdvertTimer();
|
updateFloodAdvertTimer();
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ void UITask::begin(NodePrefs* node_prefs, const char* build_date, const char* fi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// v1.2.3 (1 Jan 2025)
|
// v1.2.3 (1 Jan 2025)
|
||||||
sprintf(_version_info, "%s (%s)", version, build_date);
|
snprintf(_version_info, sizeof(_version_info), "%s (%s)", version, build_date);
|
||||||
|
free(version);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UITask::renderCurrScreen() {
|
void UITask::renderCurrScreen() {
|
||||||
|
|||||||
@@ -731,6 +731,7 @@ SensorMesh::SensorMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::Millise
|
|||||||
_prefs.gps_enabled = 0;
|
_prefs.gps_enabled = 0;
|
||||||
_prefs.gps_interval = 0;
|
_prefs.gps_interval = 0;
|
||||||
_prefs.advert_loc_policy = ADVERT_LOC_PREFS;
|
_prefs.advert_loc_policy = ADVERT_LOC_PREFS;
|
||||||
|
_prefs.radio_fem_rxgain = 1;
|
||||||
|
|
||||||
memset(default_scope.key, 0, sizeof(default_scope.key));
|
memset(default_scope.key, 0, sizeof(default_scope.key));
|
||||||
}
|
}
|
||||||
@@ -766,6 +767,7 @@ void SensorMesh::begin(FILESYSTEM* fs) {
|
|||||||
|
|
||||||
radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr);
|
radio_driver.setParams(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr);
|
||||||
radio_driver.setTxPower(_prefs.tx_power_dbm);
|
radio_driver.setTxPower(_prefs.tx_power_dbm);
|
||||||
|
board.setLoRaFemLnaEnabled(_prefs.radio_fem_rxgain);
|
||||||
|
|
||||||
updateAdvertTimer();
|
updateAdvertTimer();
|
||||||
updateFloodAdvertTimer();
|
updateFloodAdvertTimer();
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ void UITask::begin(NodePrefs* node_prefs, const char* build_date, const char* fi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// v1.2.3 (1 Jan 2025)
|
// v1.2.3 (1 Jan 2025)
|
||||||
sprintf(_version_info, "%s (%s)", version, build_date);
|
snprintf(_version_info, sizeof(_version_info), "%s (%s)", version, build_date);
|
||||||
|
free(version);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UITask::renderCurrScreen() {
|
void UITask::renderCurrScreen() {
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ public:
|
|||||||
virtual uint8_t getStartupReason() const = 0;
|
virtual uint8_t getStartupReason() const = 0;
|
||||||
virtual bool getBootloaderVersion(char* version, size_t max_len) { return false; }
|
virtual bool getBootloaderVersion(char* version, size_t max_len) { return false; }
|
||||||
virtual bool startOTAUpdate(const char* id, char reply[]) { return false; } // not supported
|
virtual bool startOTAUpdate(const char* id, char reply[]) { return false; } // not supported
|
||||||
|
virtual bool setLoRaFemLnaEnabled(bool enable) { return false; }
|
||||||
|
virtual bool canControlLoRaFemLna() const { return false; }
|
||||||
|
virtual bool isLoRaFemLnaEnabled() const { return false; }
|
||||||
|
|
||||||
// Power management interface (boards with power management override these)
|
// Power management interface (boards with power management override these)
|
||||||
virtual bool isExternalPowered() { return false; }
|
virtual bool isExternalPowered() { return false; }
|
||||||
|
|||||||
+42
-11
@@ -88,10 +88,11 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
|||||||
file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
||||||
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||||
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||||
file.read((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 290
|
file.read((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 290
|
||||||
file.read((uint8_t *)&_prefs->flood_max_unscoped, sizeof(_prefs->flood_max_unscoped)); // 291
|
file.read((uint8_t *)&_prefs->flood_max_unscoped, sizeof(_prefs->flood_max_unscoped)); // 291
|
||||||
file.read((uint8_t *)&_prefs->flood_max_advert, sizeof(_prefs->flood_max_advert)); // 292
|
file.read((uint8_t *)&_prefs->flood_max_advert, sizeof(_prefs->flood_max_advert)); // 292
|
||||||
// next: 293
|
file.read((uint8_t *)&_prefs->radio_fem_rxgain, sizeof(_prefs->radio_fem_rxgain)); // 293
|
||||||
|
// next: 294
|
||||||
|
|
||||||
// sanitise bad pref values
|
// sanitise bad pref values
|
||||||
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
||||||
@@ -121,6 +122,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
|||||||
|
|
||||||
// sanitise settings
|
// sanitise settings
|
||||||
_prefs->rx_boosted_gain = constrain(_prefs->rx_boosted_gain, 0, 1); // boolean
|
_prefs->rx_boosted_gain = constrain(_prefs->rx_boosted_gain, 0, 1); // boolean
|
||||||
|
_prefs->radio_fem_rxgain = constrain(_prefs->radio_fem_rxgain, 0, 1); // boolean
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
@@ -181,10 +183,11 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
|
|||||||
file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
|
||||||
file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
|
||||||
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
|
||||||
file.write((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 290
|
file.write((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 290
|
||||||
file.write((uint8_t *)&_prefs->flood_max_unscoped, sizeof(_prefs->flood_max_unscoped)); // 291
|
file.write((uint8_t *)&_prefs->flood_max_unscoped, sizeof(_prefs->flood_max_unscoped)); // 291
|
||||||
file.write((uint8_t *)&_prefs->flood_max_advert, sizeof(_prefs->flood_max_advert)); // 292
|
file.write((uint8_t *)&_prefs->flood_max_advert, sizeof(_prefs->flood_max_advert)); // 292
|
||||||
// next: 293
|
file.write((uint8_t *)&_prefs->radio_fem_rxgain, sizeof(_prefs->radio_fem_rxgain)); // 293
|
||||||
|
// next: 294
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
@@ -568,6 +571,28 @@ void CommonCLI::handleSetCmd(uint32_t sender_timestamp, char* command, char* rep
|
|||||||
savePrefs();
|
savePrefs();
|
||||||
_callbacks->setRxBoostedGain(_prefs->rx_boosted_gain);
|
_callbacks->setRxBoostedGain(_prefs->rx_boosted_gain);
|
||||||
#endif
|
#endif
|
||||||
|
} else if (memcmp(config, "radio.fem.rxgain ", 17) == 0) {
|
||||||
|
if (!_board->canControlLoRaFemLna()) {
|
||||||
|
strcpy(reply, "Error: unsupported");
|
||||||
|
} else if (memcmp(&config[17], "on", 2) == 0) {
|
||||||
|
if (_board->setLoRaFemLnaEnabled(true)) {
|
||||||
|
_prefs->radio_fem_rxgain = 1;
|
||||||
|
savePrefs();
|
||||||
|
strcpy(reply, "OK - LoRa FEM RX gain on");
|
||||||
|
} else {
|
||||||
|
strcpy(reply, "Error: failed to apply LoRa FEM RX gain");
|
||||||
|
}
|
||||||
|
} else if (memcmp(&config[17], "off", 3) == 0) {
|
||||||
|
if (_board->setLoRaFemLnaEnabled(false)) {
|
||||||
|
_prefs->radio_fem_rxgain = 0;
|
||||||
|
savePrefs();
|
||||||
|
strcpy(reply, "OK - LoRa FEM RX gain off");
|
||||||
|
} else {
|
||||||
|
strcpy(reply, "Error: failed to apply LoRa FEM RX gain");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
strcpy(reply, "Error: state must be on or off");
|
||||||
|
}
|
||||||
} else if (memcmp(config, "radio ", 6) == 0) {
|
} else if (memcmp(config, "radio ", 6) == 0) {
|
||||||
strcpy(tmp, &config[6]);
|
strcpy(tmp, &config[6]);
|
||||||
const char *parts[4];
|
const char *parts[4];
|
||||||
@@ -757,7 +782,7 @@ void CommonCLI::handleSetCmd(uint32_t sender_timestamp, char* command, char* rep
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_prefs->adc_multiplier = 0.0f;
|
_prefs->adc_multiplier = 0.0f;
|
||||||
strcpy(reply, "Error: unsupported by this board");
|
strcpy(reply, "Error: unsupported");
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
strcpy(reply, "unknown config: ");
|
strcpy(reply, "unknown config: ");
|
||||||
@@ -805,6 +830,12 @@ void CommonCLI::handleGetCmd(uint32_t sender_timestamp, char* command, char* rep
|
|||||||
} else if (memcmp(config, "radio.rxgain", 12) == 0) {
|
} else if (memcmp(config, "radio.rxgain", 12) == 0) {
|
||||||
sprintf(reply, "> %s", _prefs->rx_boosted_gain ? "on" : "off");
|
sprintf(reply, "> %s", _prefs->rx_boosted_gain ? "on" : "off");
|
||||||
#endif
|
#endif
|
||||||
|
} else if (memcmp(config, "radio.fem.rxgain", 16) == 0) {
|
||||||
|
if (!_board->canControlLoRaFemLna()) {
|
||||||
|
strcpy(reply, "Error: unsupported");
|
||||||
|
} else {
|
||||||
|
sprintf(reply, "> %s", _board->isLoRaFemLnaEnabled() ? "on" : "off");
|
||||||
|
}
|
||||||
} else if (memcmp(config, "radio", 5) == 0) {
|
} else if (memcmp(config, "radio", 5) == 0) {
|
||||||
char freq[16], bw[16];
|
char freq[16], bw[16];
|
||||||
strcpy(freq, StrHelper::ftoa(_prefs->freq));
|
strcpy(freq, StrHelper::ftoa(_prefs->freq));
|
||||||
@@ -890,12 +921,12 @@ void CommonCLI::handleGetCmd(uint32_t sender_timestamp, char* command, char* rep
|
|||||||
strcpy(reply, "> unknown");
|
strcpy(reply, "> unknown");
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
strcpy(reply, "ERROR: unsupported");
|
strcpy(reply, "Error: unsupported");
|
||||||
#endif
|
#endif
|
||||||
} else if (memcmp(config, "adc.multiplier", 14) == 0) {
|
} else if (memcmp(config, "adc.multiplier", 14) == 0) {
|
||||||
float adc_mult = _board->getAdcMultiplier();
|
float adc_mult = _board->getAdcMultiplier();
|
||||||
if (adc_mult == 0.0f) {
|
if (adc_mult == 0.0f) {
|
||||||
strcpy(reply, "Error: unsupported by this board");
|
strcpy(reply, "Error: unsupported");
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "> %.3f", adc_mult);
|
sprintf(reply, "> %.3f", adc_mult);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ struct NodePrefs { // persisted to file
|
|||||||
float adc_multiplier;
|
float adc_multiplier;
|
||||||
char owner_info[120];
|
char owner_info[120];
|
||||||
uint8_t rx_boosted_gain; // power settings
|
uint8_t rx_boosted_gain; // power settings
|
||||||
|
uint8_t radio_fem_rxgain; // LoRa FEM RX gain setting
|
||||||
uint8_t path_hash_mode; // which path mode to use when sending
|
uint8_t path_hash_mode; // which path mode to use when sending
|
||||||
uint8_t loop_detect;
|
uint8_t loop_detect;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,8 +12,9 @@ class LoRaFEMControl
|
|||||||
void setRxModeEnable(void);
|
void setRxModeEnable(void);
|
||||||
void setRxModeEnableWhenMCUSleep(void);
|
void setRxModeEnableWhenMCUSleep(void);
|
||||||
void setLNAEnable(bool enabled);
|
void setLNAEnable(bool enabled);
|
||||||
bool isLnaCanControl(void) { return lna_can_control; }
|
bool isLnaCanControl(void) const { return lna_can_control; }
|
||||||
void setLnaCanControl(bool can_control) { lna_can_control = can_control; }
|
void setLnaCanControl(bool can_control) { lna_can_control = can_control; }
|
||||||
|
bool isLNAEnabled(void) const { return lna_enabled; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool lna_enabled = false;
|
bool lna_enabled = false;
|
||||||
|
|||||||
@@ -124,3 +124,21 @@ void T096Board::powerOff() {
|
|||||||
const char* T096Board::getManufacturerName() const {
|
const char* T096Board::getManufacturerName() const {
|
||||||
return "Heltec T096";
|
return "Heltec T096";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool T096Board::setLoRaFemLnaEnabled(bool enable) {
|
||||||
|
if (!loRaFEMControl.isLnaCanControl()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
loRaFEMControl.setLNAEnable(enable);
|
||||||
|
loRaFEMControl.setRxModeEnable();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool T096Board::canControlLoRaFemLna() const {
|
||||||
|
return loRaFEMControl.isLnaCanControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool T096Board::isLoRaFemLnaEnabled() const {
|
||||||
|
return loRaFEMControl.isLNAEnabled();
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,4 +25,7 @@ public:
|
|||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
const char* getManufacturerName() const override ;
|
const char* getManufacturerName() const override ;
|
||||||
void powerOff() override;
|
void powerOff() override;
|
||||||
|
bool setLoRaFemLnaEnabled(bool enable) override;
|
||||||
|
bool canControlLoRaFemLna() const override;
|
||||||
|
bool isLoRaFemLnaEnabled() const override;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -82,3 +82,21 @@ void HeltecTrackerV2Board::begin() {
|
|||||||
const char* HeltecTrackerV2Board::getManufacturerName() const {
|
const char* HeltecTrackerV2Board::getManufacturerName() const {
|
||||||
return "Heltec Tracker V2";
|
return "Heltec Tracker V2";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HeltecTrackerV2Board::setLoRaFemLnaEnabled(bool enable) {
|
||||||
|
if (!loRaFEMControl.isLnaCanControl()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
loRaFEMControl.setLNAEnable(enable);
|
||||||
|
loRaFEMControl.setRxModeEnable();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeltecTrackerV2Board::canControlLoRaFemLna() const {
|
||||||
|
return loRaFEMControl.isLnaCanControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeltecTrackerV2Board::isLoRaFemLnaEnabled() const {
|
||||||
|
return loRaFEMControl.isLNAEnabled();
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,5 +21,8 @@ public:
|
|||||||
void powerOff() override;
|
void powerOff() override;
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
const char* getManufacturerName() const override ;
|
const char* getManufacturerName() const override ;
|
||||||
|
bool setLoRaFemLnaEnabled(bool enable) override;
|
||||||
|
bool canControlLoRaFemLna() const override;
|
||||||
|
bool isLoRaFemLnaEnabled() const override;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,8 +12,9 @@ class LoRaFEMControl
|
|||||||
void setRxModeEnable(void);
|
void setRxModeEnable(void);
|
||||||
void setRxModeEnableWhenMCUSleep(void);
|
void setRxModeEnableWhenMCUSleep(void);
|
||||||
void setLNAEnable(bool enabled);
|
void setLNAEnable(bool enabled);
|
||||||
bool isLnaCanControl(void) { return lna_can_control; }
|
bool isLnaCanControl(void) const { return lna_can_control; }
|
||||||
void setLnaCanControl(bool can_control) { lna_can_control = can_control; }
|
void setLnaCanControl(bool can_control) { lna_can_control = can_control; }
|
||||||
|
bool isLNAEnabled(void) const { return lna_enabled; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool lna_enabled = false;
|
bool lna_enabled = false;
|
||||||
|
|||||||
@@ -83,3 +83,21 @@ void HeltecV4Board::begin() {
|
|||||||
return loRaFEMControl.getFEMType() == KCT8103L_PA ? "Heltec V4.3 OLED" : "Heltec V4 OLED";
|
return loRaFEMControl.getFEMType() == KCT8103L_PA ? "Heltec V4.3 OLED" : "Heltec V4 OLED";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HeltecV4Board::setLoRaFemLnaEnabled(bool enable) {
|
||||||
|
if (!loRaFEMControl.isLnaCanControl()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
loRaFEMControl.setLNAEnable(enable);
|
||||||
|
loRaFEMControl.setRxModeEnable();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeltecV4Board::canControlLoRaFemLna() const {
|
||||||
|
return loRaFEMControl.isLnaCanControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeltecV4Board::isLoRaFemLnaEnabled() const {
|
||||||
|
return loRaFEMControl.isLNAEnabled();
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,6 +25,9 @@ public:
|
|||||||
void onAfterTransmit(void) override;
|
void onAfterTransmit(void) override;
|
||||||
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
|
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
|
||||||
void powerOff() override;
|
void powerOff() override;
|
||||||
|
bool setLoRaFemLnaEnabled(bool enable) override;
|
||||||
|
bool canControlLoRaFemLna() const override;
|
||||||
|
bool isLoRaFemLnaEnabled() const override;
|
||||||
uint16_t getBattMilliVolts() override;
|
uint16_t getBattMilliVolts() override;
|
||||||
bool setAdcMultiplier(float multiplier) override {
|
bool setAdcMultiplier(float multiplier) override {
|
||||||
if (multiplier == 0.0f) {
|
if (multiplier == 0.0f) {
|
||||||
|
|||||||
@@ -18,8 +18,9 @@ class LoRaFEMControl
|
|||||||
void setRxModeEnable(void);
|
void setRxModeEnable(void);
|
||||||
void setRxModeEnableWhenMCUSleep(void);
|
void setRxModeEnableWhenMCUSleep(void);
|
||||||
void setLNAEnable(bool enabled);
|
void setLNAEnable(bool enabled);
|
||||||
bool isLnaCanControl(void) { return lna_can_control; }
|
bool isLnaCanControl(void) const { return lna_can_control; }
|
||||||
void setLnaCanControl(bool can_control) { lna_can_control = can_control; }
|
void setLnaCanControl(bool can_control) { lna_can_control = can_control; }
|
||||||
|
bool isLNAEnabled(void) const { return lna_enabled; }
|
||||||
LoRaFEMType getFEMType(void) const { return fem_type; }
|
LoRaFEMType getFEMType(void) const { return fem_type; }
|
||||||
private:
|
private:
|
||||||
LoRaFEMType fem_type=OTHER_FEM_TYPES;
|
LoRaFEMType fem_type=OTHER_FEM_TYPES;
|
||||||
|
|||||||
Reference in New Issue
Block a user