diff --git a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp index e8e193b..71b8d70 100644 --- a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp @@ -14,6 +14,12 @@ // offset from initalized CMT base frequency to Hoy base frequency in channels #define CMT_BASE_CH_OFFSET860 ((860000000 - HOY_BASE_FREQ) / CMT2300A_ONE_STEP_SIZE / FH_OFFSET) +// frequency can not be lower than actual initailized base freq +#define CMT_MIN_FREQ_KHZ ((HOY_BASE_FREQ + (CMT_BASE_CH_OFFSET860 >= 1 ? CMT_BASE_CH_OFFSET860 : 1) * CMT2300A_ONE_STEP_SIZE * FH_OFFSET) / 1000) + +// =923500, 0xFF does not work +#define CMT_MAX_FREQ_KHZ ((HOY_BASE_FREQ + 0xFE * CMT2300A_ONE_STEP_SIZE * FH_OFFSET) / 1000) + String HoymilesRadio_CMT::cmtChToFreq(const uint8_t channel) { return String((HOY_BASE_FREQ + (CMT_BASE_CH_OFFSET860 + channel) * FH_OFFSET * CMT2300A_ONE_STEP_SIZE) / 1000000.0, 2) + " MHz"; @@ -34,11 +40,9 @@ uint8_t HoymilesRadio_CMT::cmtFreqToChan(const String& func_name, const String& func_name.c_str(), var_name.c_str(), freq_kHz / 1000.0); return 0xFF; // ERROR } - const uint32_t min_Freq_kHz = (HOY_BASE_FREQ + (CMT_BASE_CH_OFFSET860 >= 1 ? CMT_BASE_CH_OFFSET860 : 1) * CMT2300A_ONE_STEP_SIZE * FH_OFFSET) / 1000; // frequency can not be lower than actual initailized base freq - const uint32_t max_Freq_kHz = (HOY_BASE_FREQ + 0xFE * CMT2300A_ONE_STEP_SIZE * FH_OFFSET) / 1000; // =923500, 0xFF does not work - if (freq_kHz < min_Freq_kHz || freq_kHz > max_Freq_kHz) { + if (freq_kHz < CMT_MIN_FREQ_KHZ || freq_kHz > CMT_MAX_FREQ_KHZ) { Hoymiles.getMessageOutput()->printf("%s %s %.2f MHz is out of Hoymiles/CMT range! (%.2f MHz - %.2f MHz)\r\n", - func_name.c_str(), var_name.c_str(), freq_kHz / 1000.0, min_Freq_kHz / 1000.0, max_Freq_kHz / 1000.0); + func_name.c_str(), var_name.c_str(), freq_kHz / 1000.0, CMT_MIN_FREQ_KHZ / 1000.0, CMT_MAX_FREQ_KHZ / 1000.0); return 0xFF; // ERROR } if (freq_kHz < 863000 || freq_kHz > 870000) { @@ -453,6 +457,16 @@ bool HoymilesRadio_CMT::isConnected() return _radio->isChipConnected(); } +uint32_t HoymilesRadio_CMT::getMinFrequency() +{ + return CMT_MIN_FREQ_KHZ; +} + +uint32_t HoymilesRadio_CMT::getMaxFrequency() +{ + return CMT_MAX_FREQ_KHZ; +} + void ARDUINO_ISR_ATTR HoymilesRadio_CMT::handleInt1() { _packetSent = true; diff --git a/lib/Hoymiles/src/HoymilesRadio_CMT.h b/lib/Hoymiles/src/HoymilesRadio_CMT.h index f4218c1..a2fe137 100644 --- a/lib/Hoymiles/src/HoymilesRadio_CMT.h +++ b/lib/Hoymiles/src/HoymilesRadio_CMT.h @@ -51,6 +51,9 @@ public: bool isConnected(); + static uint32_t getMinFrequency(); + static uint32_t getMaxFrequency(); + private: void ARDUINO_ISR_ATTR handleInt1(); void ARDUINO_ISR_ATTR handleInt2(); diff --git a/src/WebApi_dtu.cpp b/src/WebApi_dtu.cpp index c89fb78..fc4dade 100644 --- a/src/WebApi_dtu.cpp +++ b/src/WebApi_dtu.cpp @@ -129,11 +129,14 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request) return; } - if (root["cmt_frequency"].as() < 860000 || root["cmt_frequency"].as() > 923000 || root["cmt_frequency"].as() % 250 > 0) { + if (root["cmt_frequency"].as() < Hoymiles.getRadioCmt()->getMinFrequency() + || root["cmt_frequency"].as() > Hoymiles.getRadioCmt()->getMaxFrequency() + || root["cmt_frequency"].as() % 250 > 0) { + retMsg["message"] = "Invalid CMT frequency setting!"; retMsg["code"] = WebApiError::DtuInvalidCmtFrequency; - retMsg["param"]["min"] = 860000; - retMsg["param"]["max"] = 923000; + retMsg["param"]["min"] = Hoymiles.getRadioCmt()->getMinFrequency(); + retMsg["param"]["max"] = Hoymiles.getRadioCmt()->getMaxFrequency(); response->setLength(); request->send(response); return;