Implement property in HoymilesRadio_CMT to set the frequency during runtime

This commit is contained in:
Thomas Basler 2023-03-30 19:45:16 +02:00
parent 70b85fad6f
commit 5e11f0b854
3 changed files with 18 additions and 3 deletions

View File

@ -199,7 +199,7 @@ enumCMTresult HoymilesRadio_CMT::cmtProcess(void)
cmtRxTimeoutCnt++; cmtRxTimeoutCnt++;
} else { } else {
uint32_t invSerial = cmtTxBuffer[1] << 24 | cmtTxBuffer[2] << 16 | cmtTxBuffer[3] << 8 | cmtTxBuffer[4]; // read inverter serial from last Tx buffer uint32_t invSerial = cmtTxBuffer[1] << 24 | cmtTxBuffer[2] << 16 | cmtTxBuffer[3] << 8 | cmtTxBuffer[4]; // read inverter serial from last Tx buffer
cmtSwitchInvAndDtuFreq(invSerial, HOY_BOOT_FREQ / 1000, HOYMILES_CMT_WORK_FREQ); cmtSwitchInvAndDtuFreq(invSerial, HOY_BOOT_FREQ / 1000, _inverterTargetFrequency);
} }
nRes = CMT_RX_TIMEOUT; nRes = CMT_RX_TIMEOUT;
@ -306,7 +306,7 @@ void HoymilesRadio_CMT::init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int
_radio->begin(); _radio->begin();
cmtSwitchDtuFreq(HOYMILES_CMT_WORK_FREQ); // start dtu at work freqency, for fast Rx if inverter is already on and frequency switched cmtSwitchDtuFreq(_inverterTargetFrequency); // start dtu at work freqency, for fast Rx if inverter is already on and frequency switched
if (_radio->isChipConnected()) { if (_radio->isChipConnected()) {
Hoymiles.getMessageOutput()->println("Connection successful"); Hoymiles.getMessageOutput()->println("Connection successful");
@ -436,6 +436,15 @@ void HoymilesRadio_CMT::setPALevel(int8_t paLevel)
} }
} }
void HoymilesRadio_CMT::setInverterTargetFrequency(uint32_t frequency)
{
_inverterTargetFrequency = frequency;
if (!_isInitialized) {
return;
}
cmtSwitchDtuFreq(_inverterTargetFrequency);
}
bool HoymilesRadio_CMT::isConnected() bool HoymilesRadio_CMT::isConnected()
{ {
if (!_isInitialized) { if (!_isInitialized) {

View File

@ -13,6 +13,10 @@
// number of fragments hold in buffer // number of fragments hold in buffer
#define FRAGMENT_BUFFER_SIZE 30 #define FRAGMENT_BUFFER_SIZE 30
#ifndef HOYMILES_CMT_WORK_FREQ
#define HOYMILES_CMT_WORK_FREQ 865000
#endif
/* CMT states */ /* CMT states */
typedef enum { typedef enum {
CMT_STATE_IDLE = 0, CMT_STATE_IDLE = 0,
@ -43,6 +47,7 @@ public:
void init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, int8_t pin_gpio2, int8_t pin_gpio3); void init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, int8_t pin_gpio2, int8_t pin_gpio3);
void loop(); void loop();
void setPALevel(int8_t paLevel); void setPALevel(int8_t paLevel);
void setInverterTargetFrequency(uint32_t frequency);
bool isConnected(); bool isConnected();
@ -64,6 +69,8 @@ private:
TimeoutHelper _rxTimeout; TimeoutHelper _rxTimeout;
TimeoutHelper _txTimeout; TimeoutHelper _txTimeout;
uint32_t _inverterTargetFrequency = HOYMILES_CMT_WORK_FREQ;
String cmtChToFreq(const uint8_t channel); String cmtChToFreq(const uint8_t channel);
void cmtSwitchChannel(const uint8_t channel); void cmtSwitchChannel(const uint8_t channel);
uint8_t cmtFreqToChan(const String& func_name, const String& var_name, const uint32_t freq_kHz); uint8_t cmtFreqToChan(const String& func_name, const String& var_name, const uint32_t freq_kHz);

View File

@ -56,7 +56,6 @@ build_flags = ${env.build_flags}
-DHOYMILES_PIN_IRQ=16 -DHOYMILES_PIN_IRQ=16
-DHOYMILES_PIN_CE=4 -DHOYMILES_PIN_CE=4
-DHOYMILES_PIN_CS=5 -DHOYMILES_PIN_CS=5
-DHOYMILES_CMT_WORK_FREQ=865000
[env:olimex_esp32_poe] [env:olimex_esp32_poe]