Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions main/boards/board.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ void Board::loadSettings()
m_vrFrequency = Config::getVrFrequency(m_defaultVrFrequency);

for (int ch = 0; ch < 2; ch++) {
m_fanMode[ch] = Config::getFanMode(ch, m_fanMode[ch]);
m_pidSettings[ch].targetTemp = Config::getFanPidTargetTemp(ch, m_pidSettings[ch].targetTemp);
m_pidSettings[ch].p = Config::getFanPidP(ch, m_pidSettings[ch].p);
m_pidSettings[ch].i = Config::getFanPidI(ch, m_pidSettings[ch].i);
Expand Down
9 changes: 9 additions & 0 deletions main/boards/board.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ class Board {
// ch1 base defaults (overridden in subclass ctors where needed): 65°C, p=6, i=0.1, d=10.
PidSettings m_pidSettings[2] = {{}, {65, 600, 10, 1000}};

// Fan control mode per channel (0=manual, 2=PID, 3=linked). Initialized to
// the default here and overwritten from NVS in loadSettings() — same
// handling as m_pidSettings. ch0 = global Kconfig default, ch1 = linked.
int m_fanMode[2] = {CONFIG_AUTO_FAN_SPEED_VALUE, 3};

// Human-readable connector labels shown in the web UI
const char* m_fanLabels[2] = {"Fan 1", "Fan 2"};

Expand Down Expand Up @@ -314,6 +319,10 @@ class Board {
return &m_pidSettings[ch];
}

int getFanMode(int ch) {
return m_fanMode[ch];
}

const char* getFanLabel(int ch) const {
if (ch < 0 || ch >= m_numFans) return "";
return m_fanLabels[ch];
Expand Down
8 changes: 6 additions & 2 deletions main/boards/q1373.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ Q1373B::Q1373B() : Q1370B()

m_asicFrequencies = {250, 275, 300, 325, 350, 375, 400, 425, 475, 500, 550};
m_asicVoltages = {980, 990, 1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070, 1080};
m_defaultAsicFrequency = m_asicFrequency = 350;
m_defaultAsicFrequency = m_asicFrequency = 425;
m_defaultAsicVoltageMillis = m_asicVoltageMillis = 1010;
m_absMaxAsicFrequency = 730;
m_absMinAsicVoltageMillis = 900;
m_absMaxAsicVoltageMillis = 1200;
m_initVoltageMillis = 1050;

m_pidSettings[0].targetTemp = 55;
m_pidSettings[0].targetTemp = 60;
m_pidSettings[0].p = 600; // 6.00
m_pidSettings[0].i = 10; // 0.10
m_pidSettings[0].d = 1000; // 10.00
Expand All @@ -51,6 +51,10 @@ Q1373B::Q1373B() : Q1370B()
m_pidSettings[1].i = 10; // 0.10
m_pidSettings[1].d = 1000; // 10.00

// ship with PID fan control by default (ch1 stays linked); with target 60°C
// the fan holds max(ASIC, VReg) for good out-of-the-box efficiency
m_fanMode[0] = 2; // PID

m_asicMaxDifficulty = 4096;
m_asicMinDifficulty = 1024;
m_asicMinDifficultyDualPool = 512;
Expand Down
2 changes: 1 addition & 1 deletion main/displays/displayDriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ DisplayDriver::DisplayDriver() {
void DisplayDriver::loadSettings() {
PThreadGuard lock(m_lvglMutex);
m_isAutoScreenOffEnabled = Config::isAutoScreenOffEnabled();
m_tempControlMode = Config::getTempControlMode();
m_tempControlMode = SYSTEM_MODULE.getBoard()->getFanMode(0);
m_fanSpeed = Config::getFanSpeed();
m_showFoundBlockEnabled = Config::isShowBlockFoundEnabled();

Expand Down
2 changes: 1 addition & 1 deletion main/fan_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ void FanController::loadSettings()
for (int ch = 0; ch < m_numChannels; ch++) {
PidSettings* bp = m_board->getPidSettings(ch);

m_config[ch].mode = static_cast<Mode>(Config::getFanMode(ch));
m_config[ch].mode = static_cast<Mode>(m_board->getFanMode(ch));
m_config[ch].manualSpeed = Config::getFanManualSpeed(ch);
m_config[ch].overheatTemp = Config::getFanOverheatTemp(ch);
m_config[ch].pid.targetTemp = Config::getFanPidTargetTemp(ch, bp->targetTemp);
Expand Down
2 changes: 1 addition & 1 deletion main/http_server/handler_can_swarm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ esp_err_t GET_can_nodes(httpd_req_t *req)
JsonArray fans = master["fans"].to<JsonArray>();
for (int ch = 0; ch < numFans; ch++) {
JsonObject fan = fans.add<JsonObject>();
fan["mode"] = Config::getFanMode(ch);
fan["mode"] = board->getFanMode(ch);
fan["manualSpeed"] = Config::getFanManualSpeed(ch);
fan["overheatTemp"]= Config::getFanOverheatTemp(ch);
fan["targetTemp"] = board->getPidSettings(ch)->targetTemp;
Expand Down
4 changes: 2 additions & 2 deletions main/http_server/handler_system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ esp_err_t GET_system_info(httpd_req_t *req)
PidSettings* fanPid = board->getPidSettings(ch);
JsonObject fan = fans.add<JsonObject>();
fan["label"] = board->getFanLabel(ch);
fan["mode"] = Config::getFanMode(ch);
fan["mode"] = board->getFanMode(ch);
fan["manualSpeed"] = Config::getFanManualSpeed(ch);
fan["overheatTemp"] = Config::getFanOverheatTemp(ch);
fan["rpm"] = POWER_MANAGEMENT_MODULE.getFanRPM(ch);
Expand Down Expand Up @@ -228,7 +228,7 @@ esp_err_t GET_system_info(httpd_req_t *req)
doc["invertscreen"] = Config::isInvertScreenEnabled() ? 1 : 0; // unused?
doc["autoscreenoff"] = Config::isAutoScreenOffEnabled() ? 1 : 0;
doc["invertfanpolarity"] = board->isInvertFanPolarityEnabled() ? 1 : 0;
doc["autofanspeed"] = Config::getTempControlMode();
doc["autofanspeed"] = board->getFanMode(0);
doc["stratum_keep"] = Config::isStratumKeepaliveEnabled() ? 1 : 0;
#ifdef VR_FREQUENCY_ENABLED
doc["vrFrequency"] = board->getVrFrequency();
Expand Down
2 changes: 1 addition & 1 deletion main/http_server/v2/handler_v2_settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ esp_err_t GET_V2_settings(httpd_req_t *req)
PidSettings* fanPid = board->getPidSettings(ch);
JsonObject fan = fans.add<JsonObject>();
fan["label"] = board->getFanLabel(ch);
fan["mode"] = Config::getFanMode(ch);
fan["mode"] = board->getFanMode(ch);
fan["manualSpeed"] = Config::getFanManualSpeed(ch);
fan["overheatTemp"] = Config::getFanOverheatTemp(ch);
JsonObject pid_obj = fan["pid"].to<JsonObject>();
Expand Down
7 changes: 3 additions & 4 deletions main/nvs_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,6 @@ namespace Config {
inline uint16_t getFanSpeed() { return cfgGetU16(NVS_CONFIG_FAN_SPEED, CONFIG_FAN_SPEED); }
inline uint16_t getOverheatTemp() { return cfgGetU16(NVS_CONFIG_OVERHEAT_TEMP, CONFIG_OVERHEAT_TEMP); }
inline uint16_t getInfluxPort() { return cfgGetU16(NVS_CONFIG_INFLUX_PORT, CONFIG_INFLUX_PORT); }
inline uint16_t getTempControlMode() { return cfgGetU16(NVS_CONFIG_AUTO_FAN_SPEED, CONFIG_AUTO_FAN_SPEED_VALUE); }
inline uint16_t getPoolMode() { return cfgGetU16(NVS_CONFIG_POOL_MODE, 0); }
inline uint16_t getPoolBalance() { return cfgGetU16(NVS_CONFIG_POOL_MODE_BALANCE, 50); }

Expand All @@ -214,9 +213,9 @@ namespace Config {
// Indexed fan-channel getters (ch=0 → ch0 NVS keys, ch=1 → fan1 NVS keys)
// ch0 defaults: mode=CONFIG_AUTO_FAN_SPEED_VALUE, speed=CONFIG_FAN_SPEED, overheat=CONFIG_OVERHEAT_TEMP
// ch1 defaults: mode=3 (linked), speed=100%, overheat=80°C
inline uint16_t getFanMode(int ch) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_AUTO_FAN_SPEED, CONFIG_AUTO_FAN_SPEED_VALUE)
: cfgGetU16(NVS_CONFIG_FAN1_MODE, 3);
inline uint16_t getFanMode(int ch, uint16_t def) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_AUTO_FAN_SPEED, def)
: cfgGetU16(NVS_CONFIG_FAN1_MODE, def);
}
inline uint16_t getFanManualSpeed(int ch) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_FAN_SPEED, CONFIG_FAN_SPEED)
Expand Down
4 changes: 2 additions & 2 deletions main/tasks/can_slave_task.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,11 @@ static void send_slave_config(uint8_t slave_id)
strncpy(c.fwVersion, app->version, sizeof(c.fwVersion) - 1);
c.freqMhz = (uint16_t) Config::getAsicFrequency(board->getDefaultAsicFrequency());
c.voltageMv = (uint16_t) Config::getAsicVoltage(board->getDefaultAsicVoltageMillis());
c.fan0Mode = (uint8_t) Config::getFanMode(0);
c.fan0Mode = (uint8_t) board->getFanMode(0);
c.fan0Speed = (uint8_t) Config::getFanManualSpeed(0);
c.fan0TargetTemp = (uint8_t) Config::getFanPidTargetTemp(0, board->getPidSettings(0)->targetTemp);
c.fan0Overheat = (uint8_t) Config::getFanOverheatTemp(0);
c.fan1Mode = (uint8_t) Config::getFanMode(1);
c.fan1Mode = (uint8_t) board->getFanMode(1);
c.fan1Speed = (uint8_t) Config::getFanManualSpeed(1);
c.fan1TargetTemp = (uint8_t) Config::getFanPidTargetTemp(1, board->getPidSettings(1)->targetTemp);
c.fan1Overheat = (uint8_t) Config::getFanOverheatTemp(1);
Expand Down
Loading