From d03deda313db60bbce0b7e60982df128380ecaf2 Mon Sep 17 00:00:00 2001 From: liquidraver <504870+liquidraver@users.noreply.github.com> Date: Wed, 22 Apr 2026 10:49:41 +0200 Subject: [PATCH] port adc.multiplier command --- zephcore/adapters/board/ZephyrBoard.cpp | 31 +++++++++++++++++++++++-- zephcore/adapters/board/ZephyrBoard.h | 7 ++++++ zephcore/src/main_companion.cpp | 3 +++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/zephcore/adapters/board/ZephyrBoard.cpp b/zephcore/adapters/board/ZephyrBoard.cpp index 1680312..a273cb4 100644 --- a/zephcore/adapters/board/ZephyrBoard.cpp +++ b/zephcore/adapters/board/ZephyrBoard.cpp @@ -135,14 +135,41 @@ uint16_t ZephyrBoard::getBattMilliVolts() return 0; } raw /= valid_samples; - uint16_t mv = (uint16_t)((VBAT_MV_MULTIPLIER * (int64_t)raw) / 4096); - LOG_DBG("Battery: raw=%d multiplier=%d mv=%u", (int)raw, VBAT_MV_MULTIPLIER, mv); + int64_t mult = (_adc_multiplier_override != 0.0f) + ? (int64_t)_adc_multiplier_override + : (int64_t)VBAT_MV_MULTIPLIER; + uint16_t mv = (uint16_t)((mult * (int64_t)raw) / 4096); + LOG_DBG("Battery: raw=%d multiplier=%lld mv=%u", (int)raw, (long long)mult, mv); return mv; #else return 0; #endif } +bool ZephyrBoard::setAdcMultiplier(float multiplier) +{ +#if DT_NODE_EXISTS(DT_PATH(zephyr_user)) && \ + DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels) + _adc_multiplier_override = multiplier; + return true; +#else + (void)multiplier; + return false; +#endif +} + +float ZephyrBoard::getAdcMultiplier() const +{ +#if DT_NODE_EXISTS(DT_PATH(zephyr_user)) && \ + DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels) + return (_adc_multiplier_override != 0.0f) + ? _adc_multiplier_override + : (float)VBAT_MV_MULTIPLIER; +#else + return 0.0f; +#endif +} + float ZephyrBoard::getMCUTemperature() { /* nRF52840 die temperature sensor - "nordic,nrf-temp" at 0x4000c000 diff --git a/zephcore/adapters/board/ZephyrBoard.h b/zephcore/adapters/board/ZephyrBoard.h index 7d752b5..c95723d 100644 --- a/zephcore/adapters/board/ZephyrBoard.h +++ b/zephcore/adapters/board/ZephyrBoard.h @@ -13,6 +13,8 @@ class ZephyrBoard : public MainBoard { public: uint16_t getBattMilliVolts() override; float getMCUTemperature() override; + bool setAdcMultiplier(float multiplier) override; + float getAdcMultiplier() const override; const char *getManufacturerName() const override; void onBeforeTransmit() override; void onAfterTransmit() override; @@ -22,6 +24,11 @@ public: bool startOTAUpdate(const char *id, char reply[]) override; /* Reboot into BLE OTA DFU */ void clearBootloaderMagic(); /* Clear stale GPREGRET values at startup */ uint8_t getStartupReason() const override; + +private: + /* Runtime override for vbat-mv-multiplier. Units match DT `vbat-mv-multiplier` + * (mV scale such that `mv = multiplier * raw / 4096`). 0 = use DT default. */ + float _adc_multiplier_override = 0.0f; }; } /* namespace mesh */ diff --git a/zephcore/src/main_companion.cpp b/zephcore/src/main_companion.cpp index 7b335d6..6c3237c 100644 --- a/zephcore/src/main_companion.cpp +++ b/zephcore/src/main_companion.cpp @@ -669,6 +669,9 @@ int main(void) lora_radio.setRxBoost(companion_mesh.prefs.rx_boost != 0); lora_radio.enableRxDutyCycle(companion_mesh.prefs.rx_duty_cycle != 0); + /* Restore runtime ADC multiplier override (0 = keep DT default) */ + zephyr_board.setAdcMultiplier(companion_mesh.prefs.adc_multiplier); + /* Initialize mesh event object */ k_event_init(&mesh_events);