Skip to content

Commit 5f06dc4

Browse files
authored
Merge pull request #1133 from oltaco/repeater-adc-multiplier-setting
Feature: configurable adc.multiplier for repeaters
2 parents fc68203 + fc93d84 commit 5f06dc4

File tree

7 files changed

+54
-3
lines changed

7 files changed

+54
-3
lines changed

examples/simple_repeater/MyMesh.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,8 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
710710
_prefs.gps_enabled = 0;
711711
_prefs.gps_interval = 0;
712712
_prefs.advert_loc_policy = ADVERT_LOC_PREFS;
713+
714+
_prefs.adc_multiplier = 0.0f; // 0.0f means use default board multiplier
713715
}
714716

715717
void MyMesh::begin(FILESYSTEM *fs) {
@@ -733,6 +735,8 @@ void MyMesh::begin(FILESYSTEM *fs) {
733735
updateAdvertTimer();
734736
updateFloodAdvertTimer();
735737

738+
board.setAdcMultiplier(_prefs.adc_multiplier);
739+
736740
#if ENV_INCLUDE_GPS == 1
737741
applyGpsPrefs();
738742
#endif

examples/simple_room_server/MyMesh.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,8 @@ void MyMesh::begin(FILESYSTEM *fs) {
641641
updateAdvertTimer();
642642
updateFloodAdvertTimer();
643643

644+
board.setAdcMultiplier(_prefs.adc_multiplier);
645+
644646
#if ENV_INCLUDE_GPS == 1
645647
applyGpsPrefs();
646648
#endif

examples/simple_sensor/SensorMesh.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,8 @@ void SensorMesh::begin(FILESYSTEM* fs) {
740740
updateAdvertTimer();
741741
updateFloodAdvertTimer();
742742

743+
board.setAdcMultiplier(_prefs.adc_multiplier);
744+
743745
#if ENV_INCLUDE_GPS == 1
744746
applyGpsPrefs();
745747
#endif

src/MeshCore.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ namespace mesh {
4242
class MainBoard {
4343
public:
4444
virtual uint16_t getBattMilliVolts() = 0;
45+
virtual bool setAdcMultiplier(float multiplier) { return false; };
46+
virtual float getAdcMultiplier() const { return 0.0f; }
4547
virtual const char* getManufacturerName() const = 0;
4648
virtual void onBeforeTransmit() { }
4749
virtual void onAfterTransmit() { }

src/helpers/CommonCLI.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
7070
file.read((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval)); // 157
7171
file.read((uint8_t *)&_prefs->advert_loc_policy, sizeof (_prefs->advert_loc_policy)); // 161
7272
file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
73-
// 166
73+
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
74+
// 170
7475

7576
// sanitise bad pref values
7677
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
@@ -83,6 +84,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
8384
_prefs->cr = constrain(_prefs->cr, 5, 8);
8485
_prefs->tx_power_dbm = constrain(_prefs->tx_power_dbm, 1, 30);
8586
_prefs->multi_acks = constrain(_prefs->multi_acks, 0, 1);
87+
_prefs->adc_multiplier = constrain(_prefs->adc_multiplier, 0.0f, 10.0f);
8688

8789
// sanitise bad bridge pref values
8890
_prefs->bridge_enabled = constrain(_prefs->bridge_enabled, 0, 1);
@@ -148,7 +150,8 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
148150
file.write((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval)); // 157
149151
file.write((uint8_t *)&_prefs->advert_loc_policy, sizeof(_prefs->advert_loc_policy)); // 161
150152
file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
151-
// 166
153+
file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
154+
// 170
152155

153156
file.close();
154157
}
@@ -331,6 +334,13 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
331334
} else if (memcmp(config, "bridge.secret", 13) == 0) {
332335
sprintf(reply, "> %s", _prefs->bridge_secret);
333336
#endif
337+
} else if (memcmp(config, "adc.multiplier", 14) == 0) {
338+
float adc_mult = _board->getAdcMultiplier();
339+
if (adc_mult == 0.0f) {
340+
strcpy(reply, "Error: unsupported by this board");
341+
} else {
342+
sprintf(reply, "> %.3f", adc_mult);
343+
}
334344
} else {
335345
sprintf(reply, "??: %s", config);
336346
}
@@ -523,6 +533,19 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
523533
savePrefs();
524534
strcpy(reply, "OK");
525535
#endif
536+
} else if (memcmp(config, "adc.multiplier ", 15) == 0) {
537+
_prefs->adc_multiplier = atof(&config[15]);
538+
if (_board->setAdcMultiplier(_prefs->adc_multiplier)) {
539+
savePrefs();
540+
if (_prefs->adc_multiplier == 0.0f) {
541+
strcpy(reply, "OK - using default board multiplier");
542+
} else {
543+
sprintf(reply, "OK - multiplier set to %.3f", _prefs->adc_multiplier);
544+
}
545+
} else {
546+
_prefs->adc_multiplier = 0.0f;
547+
strcpy(reply, "Error: unsupported by this board");
548+
};
526549
} else {
527550
sprintf(reply, "unknown config: %s", config);
528551
}

src/helpers/CommonCLI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct NodePrefs { // persisted to file
4747
uint32_t gps_interval; // in seconds
4848
uint8_t advert_loc_policy;
4949
uint32_t discovery_mod_timestamp;
50+
float adc_multiplier;
5051
};
5152

5253
class CommonCLICallbacks {

variants/promicro/PromicroBoard.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class PromicroBoard : public mesh::MainBoard {
2323
protected:
2424
uint8_t startup_reason;
2525
uint8_t btn_prev_state;
26+
float adc_mult = ADC_MULTIPLIER;
2627

2728
public:
2829
void begin();
@@ -39,7 +40,23 @@ class PromicroBoard : public mesh::MainBoard {
3940
raw += analogRead(PIN_VBAT_READ);
4041
}
4142
raw = raw / BATTERY_SAMPLES;
42-
return (ADC_MULTIPLIER * raw);
43+
return (adc_mult * raw);
44+
}
45+
46+
bool setAdcMultiplier(float multiplier) override {
47+
if (multiplier == 0.0f) {
48+
adc_mult = ADC_MULTIPLIER;}
49+
else {
50+
adc_mult = multiplier;
51+
}
52+
return true;
53+
}
54+
float getAdcMultiplier() const override {
55+
if (adc_mult == 0.0f) {
56+
return ADC_MULTIPLIER;
57+
} else {
58+
return adc_mult;
59+
}
4360
}
4461

4562
const char* getManufacturerName() const override {

0 commit comments

Comments
 (0)