diff --git a/companion/src/modeledit/node.h b/companion/src/modeledit/node.h index 896ffc088..facb44ca6 100644 --- a/companion/src/modeledit/node.h +++ b/companion/src/modeledit/node.h @@ -57,6 +57,8 @@ class Node : public QGraphicsObject void setCenteringX(bool val) { centerX = val; } void setCenteringY(bool val) { centerY = val; } + bool getCenteringX() const { return centerX; } + bool getCenteringY() const { return centerY; } void setFixedX(bool val) { fixedX = val; } void setFixedY(bool val) { fixedY = val; } bool getFixedX() { return fixedX; } diff --git a/companion/src/simulation/wasmsimulatorinterface.cpp b/companion/src/simulation/wasmsimulatorinterface.cpp index 6f76aa824..d9081741e 100644 --- a/companion/src/simulation/wasmsimulatorinterface.cpp +++ b/companion/src/simulation/wasmsimulatorinterface.cpp @@ -331,6 +331,8 @@ bool WasmSimulatorInterface::resolveExports() m_fnSetKey = wasm_runtime_lookup_function(m_moduleInst, "simuSetKey"); m_fnSetTrim = wasm_runtime_lookup_function(m_moduleInst, "simuSetTrim"); m_fnSetSwitch = wasm_runtime_lookup_function(m_moduleInst, "simuSetSwitch"); + m_fnSetTxVoltage = + wasm_runtime_lookup_function(m_moduleInst, "simuSetTxVoltage"); m_fnLcdChanged = wasm_runtime_lookup_function(m_moduleInst, "simuLcdChanged"); m_fnLcdCopy = wasm_runtime_lookup_function(m_moduleInst, "simuLcdCopy"); @@ -441,10 +443,10 @@ void WasmSimulatorInterface::init() } m_stopRequested = false; - memset(m_analogValues, 0, sizeof(m_analogValues)); // Call simuInit QMutexLocker lckr(&m_mutex); + memset(m_analogValues, 0, sizeof(m_analogValues)); wasm_runtime_call_wasm(m_execEnv, m_fnInit, 0, nullptr); // Query LCD dimensions @@ -612,12 +614,14 @@ void WasmSimulatorInterface::setVolumeGain(const int value) void WasmSimulatorInterface::setAnalogValue(uint8_t index, int16_t value) { + QMutexLocker lckr(&m_mutex); if (index < MAX_ANALOGS) m_analogValues[index] = value; } int16_t WasmSimulatorInterface::getAnalogValue(uint8_t index) { + QMutexLocker lckr(&m_mutex); if (index < MAX_ANALOGS) return m_analogValues[index]; return 0; @@ -641,6 +645,15 @@ void WasmSimulatorInterface::setSwitch(uint8_t swtch, int8_t state) wasm_runtime_call_wasm(m_execEnv, m_fnSetSwitch, 2, argv); } +void WasmSimulatorInterface::setTxVoltage(int32_t decivolts) +{ + if (!m_fnSetTxVoltage || !m_execEnv) + return; + QMutexLocker lckr(&m_mutex); + uint32_t argv[1] = {(uint32_t)decivolts}; + wasm_runtime_call_wasm(m_execEnv, m_fnSetTxVoltage, 1, argv); +} + void WasmSimulatorInterface::setTrim(unsigned int idx, int value) { if (!m_fnSetTrimValue || !m_execEnv) @@ -679,7 +692,9 @@ void WasmSimulatorInterface::setInputValue(int type, uint8_t index, setAnalogValue(index, value); break; case INPUT_SRC_TXVIN: - setAnalogValue(index, value); + // Routed via a dedicated WASM export, not setAnalogValue(): index here + // is always 0, which would collide with STICK_AXIS_LH. + setTxVoltage(value); emit txBatteryVoltageChanged((unsigned int)value); break; case INPUT_SRC_SWITCH: diff --git a/companion/src/simulation/wasmsimulatorinterface.h b/companion/src/simulation/wasmsimulatorinterface.h index 84deaffb3..6daebe891 100644 --- a/companion/src/simulation/wasmsimulatorinterface.h +++ b/companion/src/simulation/wasmsimulatorinterface.h @@ -56,6 +56,7 @@ class WasmSimulatorInterface : public SimulatorInterface void setSwitch(uint8_t swtch, int8_t state) override; void setTrim(unsigned int idx, int value) override; void setTrimSwitch(uint8_t trim, bool state) override; + void setTxVoltage(int32_t decivolts); void setTrainerInput(unsigned int inputNumber, int16_t value) override; void setInputValue(int type, uint8_t index, int16_t value) override; void rotaryEncoderEvent(int steps) override; @@ -157,6 +158,7 @@ class WasmSimulatorInterface : public SimulatorInterface wasm_function_inst_t m_fnSetKey = nullptr; wasm_function_inst_t m_fnSetTrim = nullptr; wasm_function_inst_t m_fnSetSwitch = nullptr; + wasm_function_inst_t m_fnSetTxVoltage = nullptr; wasm_function_inst_t m_fnLcdChanged = nullptr; wasm_function_inst_t m_fnLcdCopy = nullptr; wasm_function_inst_t m_fnLcdGetWidth = nullptr; diff --git a/companion/src/simulation/widgets/virtualjoystickwidget.cpp b/companion/src/simulation/widgets/virtualjoystickwidget.cpp index bd53b1de5..6902ca81a 100644 --- a/companion/src/simulation/widgets/virtualjoystickwidget.cpp +++ b/companion/src/simulation/widgets/virtualjoystickwidget.cpp @@ -419,8 +419,12 @@ void VirtualJoystickWidget::setSize(const QSize & size, const QSize &) qreal h = qr.height() - ballSize; qreal cx = qr.width() / 2; qreal cy = qr.height() / 2; - qreal nodeX = node->getX(); - qreal nodeY = node->getY(); + // Self-centering axes always resolve to 0 after a resize instead of + // reapplying a captured value, which can be garbage from a transient + // scene rect during construction/layout and would otherwise get + // permanently re-latched on every subsequent resize. + qreal nodeX = (node->getCenteringX() && !node->isPressed()) ? 0.0 : node->getX(); + qreal nodeY = (node->getCenteringY() && !node->isPressed()) ? 0.0 : node->getY(); scene->setSceneRect(-cx,-cy,w,h); diff --git a/radio/src/targets/simu/adc_driver.cpp b/radio/src/targets/simu/adc_driver.cpp index 94fa69b57..7ab04c035 100644 --- a/radio/src/targets/simu/adc_driver.cpp +++ b/radio/src/targets/simu/adc_driver.cpp @@ -51,6 +51,14 @@ uint16_t getRTCBatteryVoltage() extern uint16_t simuGetAnalog(uint8_t idx); +// Negative = no override, fall back to the vBatWarn-derived default below. +static int32_t s_simuTxVoltageOverride = -1; + +void simuSetTxVoltage(int32_t decivolts) +{ + s_simuTxVoltageOverride = decivolts; +} + static bool simu_start_conversion() { int max_input = adcGetMaxInputs(ADC_INPUT_ALL); @@ -58,13 +66,18 @@ static bool simu_start_conversion() setAnalogValue(i, simuGetAnalog(i)); } - // set batteries default voltages int i = adcGetInputOffset(ADC_INPUT_VBAT); if (i > 0) { - // +0.5V and prec2 - uint16_t vBatWarn = BATTERY_WARN; - if (g_eeGeneral.vBatWarn > 0) vBatWarn = g_eeGeneral.vBatWarn; - uint16_t volts = (vBatWarn + 5) * 10; + uint16_t vBatDeciVolts; + if (s_simuTxVoltageOverride >= 0) { + vBatDeciVolts = (uint16_t)s_simuTxVoltageOverride; + } else { + // set battery default voltage: +0.5V above the warning threshold + uint16_t vBatWarn = BATTERY_WARN; + if (g_eeGeneral.vBatWarn > 0) vBatWarn = g_eeGeneral.vBatWarn; + vBatDeciVolts = vBatWarn + 5; + } + uint16_t volts = vBatDeciVolts * 10; // prec2 setAnalogValue(i, volts * 2); } diff --git a/radio/src/targets/simu/simulib.h b/radio/src/targets/simu/simulib.h index 905364150..5e22edf86 100644 --- a/radio/src/targets/simu/simulib.h +++ b/radio/src/targets/simu/simulib.h @@ -60,6 +60,10 @@ void WASM_EXPORT(simuSetKey)(uint8_t key, bool state); void WASM_EXPORT(simuSetTrim)(uint8_t trim, bool state); void WASM_EXPORT(simuSetSwitch)(uint8_t swtch, int8_t state); +// TX battery voltage override, in decivolts (85 = 8.5V). Pass a negative +// value to clear the override and go back to the vBatWarn-derived default. +void WASM_EXPORT(simuSetTxVoltage)(int32_t decivolts); + // Touch: call simuTouchDown(x,y) on press and repeatedly during drag // (continuous position updates), then simuTouchUp() on release. // The firmware detects slides from successive position changes. diff --git a/tools/build-common.sh b/tools/build-common.sh index 7dbe0d2d6..4122bd8e4 100644 --- a/tools/build-common.sh +++ b/tools/build-common.sh @@ -182,7 +182,9 @@ get_target_build_options() { # Determine parallel job limit based on environment determine_max_jobs() { - if [[ -n ${CMAKE_BUILD_PARALLEL_LEVEL} ]]; then + if [[ -n ${MAX_JOBS} ]]; then + : # explicit caller override, keep as-is + elif [[ -n ${CMAKE_BUILD_PARALLEL_LEVEL} ]]; then MAX_JOBS=${CMAKE_BUILD_PARALLEL_LEVEL} elif [ -n "$GITHUB_ACTIONS" ]; then # Limit jobs in GitHub Actions to n-1 to avoid resource contention diff --git a/tools/build-wasm-modules.sh b/tools/build-wasm-modules.sh index 7037267db..31ef0b32a 100755 --- a/tools/build-wasm-modules.sh +++ b/tools/build-wasm-modules.sh @@ -47,9 +47,7 @@ if [[ -z ${EDGETX_VERSION_SUFFIX} ]]; then fi fi -if [[ -n "$GITHUB_ACTIONS" ]]; then - MAX_JOBS=${MAX_JOBS:-3} -fi +determine_max_jobs BUILD_DIR="build/wasm"