Introduce gpio2 for the CMT2300A module
This implements the sending interrupt instead of polling. On the other hand, gpio3 is made optional.
This commit is contained in:
parent
854fcdaeae
commit
996404ceed
@ -95,7 +95,8 @@ The json file can contain multiple profiles. Each profile requires a name and di
|
|||||||
| cmt.clk | number | CLK Pin |
|
| cmt.clk | number | CLK Pin |
|
||||||
| cmt.cs | number | CS Pin |
|
| cmt.cs | number | CS Pin |
|
||||||
| cmt.fcs | number | FCS Pin |
|
| cmt.fcs | number | FCS Pin |
|
||||||
| cmt.gpio3 | number | GPIO3 Pin |
|
| cmt.gpio2 | number | GPIO2 Pin (optional) |
|
||||||
|
| cmt.gpio3 | number | GPIO3 Pin (optional) |
|
||||||
| eth.enabled | boolean | Enable/Disable the ethernet stack |
|
| eth.enabled | boolean | Enable/Disable the ethernet stack |
|
||||||
| eth.phy_addr | number | Unique PHY addr |
|
| eth.phy_addr | number | Unique PHY addr |
|
||||||
| eth.power | number | Power Pin (if available). Use -1 for not assigned pins. |
|
| eth.power | number | Power Pin (if available). Use -1 for not assigned pins. |
|
||||||
|
|||||||
@ -22,6 +22,7 @@ struct PinMapping_t {
|
|||||||
int8_t cmt_clk;
|
int8_t cmt_clk;
|
||||||
int8_t cmt_cs;
|
int8_t cmt_cs;
|
||||||
int8_t cmt_fcs;
|
int8_t cmt_fcs;
|
||||||
|
int8_t cmt_gpio2;
|
||||||
int8_t cmt_gpio3;
|
int8_t cmt_gpio3;
|
||||||
int8_t cmt_sdio;
|
int8_t cmt_sdio;
|
||||||
|
|
||||||
|
|||||||
@ -166,7 +166,7 @@ bool CMT2300A::_init_radio()
|
|||||||
|
|
||||||
/* Config GPIOs */
|
/* Config GPIOs */
|
||||||
CMT2300A_ConfigGpio(
|
CMT2300A_ConfigGpio(
|
||||||
CMT2300A_GPIO3_SEL_INT2);
|
CMT2300A_GPIO2_SEL_INT1 | CMT2300A_GPIO3_SEL_INT2);
|
||||||
|
|
||||||
/* Config interrupt */
|
/* Config interrupt */
|
||||||
CMT2300A_ConfigInterrupt(
|
CMT2300A_ConfigInterrupt(
|
||||||
|
|||||||
@ -32,9 +32,9 @@ void HoymilesClass::initNRF(SPIClass* initialisedSpiBus, uint8_t pinCE, uint8_t
|
|||||||
_radioNrf->init(initialisedSpiBus, pinCE, pinIRQ);
|
_radioNrf->init(initialisedSpiBus, pinCE, pinIRQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HoymilesClass::initCMT(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, int8_t pin_gpio3)
|
void HoymilesClass::initCMT(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, int8_t pin_gpio2, int8_t pin_gpio3)
|
||||||
{
|
{
|
||||||
_radioCmt->init(pin_sdio, pin_clk, pin_cs, pin_fcs, pin_gpio3);
|
_radioCmt->init(pin_sdio, pin_clk, pin_cs, pin_fcs, pin_gpio2, pin_gpio3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HoymilesClass::loop()
|
void HoymilesClass::loop()
|
||||||
|
|||||||
@ -17,7 +17,7 @@ class HoymilesClass {
|
|||||||
public:
|
public:
|
||||||
void init();
|
void init();
|
||||||
void initNRF(SPIClass* initialisedSpiBus, uint8_t pinCE, uint8_t pinIRQ);
|
void initNRF(SPIClass* initialisedSpiBus, uint8_t pinCE, uint8_t pinIRQ);
|
||||||
void initCMT(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, int8_t pin_gpio3);
|
void initCMT(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 setMessageOutput(Print* output);
|
void setMessageOutput(Print* output);
|
||||||
|
|||||||
@ -119,10 +119,16 @@ enumCMTresult HoymilesRadio_CMT::cmtProcess(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMT_STATE_RX_WAIT:
|
case CMT_STATE_RX_WAIT:
|
||||||
if (_packetReceived) /* Read INT2, PKT_OK */
|
if (!_gpio3_configured) {
|
||||||
|
if (CMT2300A_MASK_PKT_OK_FLG & CMT2300A_ReadReg(CMT2300A_CUS_INT_FLAG)) { // read INT2, PKT_OK flag
|
||||||
|
_packetReceived = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_packetReceived)
|
||||||
{
|
{
|
||||||
Hoymiles.getMessageOutput()->println("Interrupt received");
|
Hoymiles.getMessageOutput()->println("Interrupt 2 received");
|
||||||
_packetReceived = false; // reset interrupt
|
_packetReceived = false; // reset interrupt 2
|
||||||
cmtNextState = CMT_STATE_RX_DONE;
|
cmtNextState = CMT_STATE_RX_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,8 +229,14 @@ enumCMTresult HoymilesRadio_CMT::cmtProcess(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CMT_STATE_TX_WAIT:
|
case CMT_STATE_TX_WAIT:
|
||||||
if (CMT2300A_MASK_TX_DONE_FLG & CMT2300A_ReadReg(CMT2300A_CUS_INT_CLR1)) /* Read TX_DONE flag */
|
if (!_gpio2_configured) {
|
||||||
{
|
if (CMT2300A_MASK_TX_DONE_FLG & CMT2300A_ReadReg(CMT2300A_CUS_INT_CLR1)) { // read INT1, TX_DONE flag
|
||||||
|
_packetSent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_packetSent) {
|
||||||
|
Hoymiles.getMessageOutput()->println(F("Interrupt 1 received"));
|
||||||
|
_packetSent = false; // reset interrupt 1
|
||||||
cmtNextState = CMT_STATE_TX_DONE;
|
cmtNextState = CMT_STATE_TX_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,7 +295,7 @@ enumCMTresult HoymilesRadio_CMT::cmtProcess(void)
|
|||||||
return nRes;
|
return nRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HoymilesRadio_CMT::init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, int8_t pin_gpio3)
|
void HoymilesRadio_CMT::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)
|
||||||
{
|
{
|
||||||
_dtuSerial.u64 = 0;
|
_dtuSerial.u64 = 0;
|
||||||
|
|
||||||
@ -301,7 +313,15 @@ void HoymilesRadio_CMT::init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int
|
|||||||
Hoymiles.getMessageOutput()->println("Connection error!!");
|
Hoymiles.getMessageOutput()->println("Connection error!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
attachInterrupt(digitalPinToInterrupt(pin_gpio3), std::bind(&HoymilesRadio_CMT::handleIntr, this), RISING);
|
if (pin_gpio2 >= 0) {
|
||||||
|
attachInterrupt(digitalPinToInterrupt(pin_gpio2), std::bind(&HoymilesRadio_CMT::handleInt1, this), RISING);
|
||||||
|
_gpio2_configured = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pin_gpio3 >= 0) {
|
||||||
|
attachInterrupt(digitalPinToInterrupt(pin_gpio3), std::bind(&HoymilesRadio_CMT::handleInt2, this), RISING);
|
||||||
|
_gpio3_configured = true;
|
||||||
|
}
|
||||||
|
|
||||||
_isInitialized = true;
|
_isInitialized = true;
|
||||||
}
|
}
|
||||||
@ -423,7 +443,12 @@ bool HoymilesRadio_CMT::isConnected()
|
|||||||
return _radio->isChipConnected();
|
return _radio->isChipConnected();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARDUINO_ISR_ATTR HoymilesRadio_CMT::handleIntr()
|
void ARDUINO_ISR_ATTR HoymilesRadio_CMT::handleInt1()
|
||||||
|
{
|
||||||
|
_packetSent = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ARDUINO_ISR_ATTR HoymilesRadio_CMT::handleInt2()
|
||||||
{
|
{
|
||||||
_packetReceived = true;
|
_packetReceived = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,20 +40,25 @@ typedef enum {
|
|||||||
|
|
||||||
class HoymilesRadio_CMT : public HoymilesRadio {
|
class HoymilesRadio_CMT : public HoymilesRadio {
|
||||||
public:
|
public:
|
||||||
void init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, 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);
|
||||||
|
|
||||||
bool isConnected();
|
bool isConnected();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ARDUINO_ISR_ATTR handleIntr();
|
void ARDUINO_ISR_ATTR handleInt1();
|
||||||
|
void ARDUINO_ISR_ATTR handleInt2();
|
||||||
|
|
||||||
void sendEsbPacket(CommandAbstract* cmd);
|
void sendEsbPacket(CommandAbstract* cmd);
|
||||||
|
|
||||||
std::unique_ptr<CMT2300A> _radio;
|
std::unique_ptr<CMT2300A> _radio;
|
||||||
|
|
||||||
volatile bool _packetReceived = false;
|
volatile bool _packetReceived = false;
|
||||||
|
volatile bool _packetSent = false;
|
||||||
|
|
||||||
|
bool _gpio2_configured = false;
|
||||||
|
bool _gpio3_configured = false;
|
||||||
|
|
||||||
std::queue<fragment_t> _rxBuffer;
|
std::queue<fragment_t> _rxBuffer;
|
||||||
TimeoutHelper _rxTimeout;
|
TimeoutHelper _rxTimeout;
|
||||||
|
|||||||
@ -33,7 +33,7 @@ void InverterSettingsClass::init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (PinMapping.isValidCmt2300Config()) {
|
if (PinMapping.isValidCmt2300Config()) {
|
||||||
Hoymiles.initCMT(pin.cmt_sdio, pin.cmt_clk, pin.cmt_cs, pin.cmt_fcs, pin.cmt_gpio3);
|
Hoymiles.initCMT(pin.cmt_sdio, pin.cmt_clk, pin.cmt_cs, pin.cmt_fcs, pin.cmt_gpio2, pin.cmt_gpio3);
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageOutput.println(" Setting radio PA level... ");
|
MessageOutput.println(" Setting radio PA level... ");
|
||||||
|
|||||||
@ -50,6 +50,10 @@
|
|||||||
#define CMT_FCS -1
|
#define CMT_FCS -1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CMT_GPIO2
|
||||||
|
#define CMT_GPIO2 -1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef CMT_GPIO3
|
#ifndef CMT_GPIO3
|
||||||
#define CMT_GPIO3 -1
|
#define CMT_GPIO3 -1
|
||||||
#endif
|
#endif
|
||||||
@ -73,6 +77,7 @@ PinMappingClass::PinMappingClass()
|
|||||||
_pinMapping.cmt_clk = CMT_CLK;
|
_pinMapping.cmt_clk = CMT_CLK;
|
||||||
_pinMapping.cmt_cs = CMT_CS;
|
_pinMapping.cmt_cs = CMT_CS;
|
||||||
_pinMapping.cmt_fcs = CMT_FCS;
|
_pinMapping.cmt_fcs = CMT_FCS;
|
||||||
|
_pinMapping.cmt_gpio2 = CMT_GPIO2;
|
||||||
_pinMapping.cmt_gpio3 = CMT_GPIO3;
|
_pinMapping.cmt_gpio3 = CMT_GPIO3;
|
||||||
_pinMapping.cmt_sdio = CMT_SDIO;
|
_pinMapping.cmt_sdio = CMT_SDIO;
|
||||||
|
|
||||||
@ -133,6 +138,7 @@ bool PinMappingClass::init(const String& deviceMapping)
|
|||||||
_pinMapping.cmt_clk = doc[i]["cmt"]["clk"] | CMT_CLK;
|
_pinMapping.cmt_clk = doc[i]["cmt"]["clk"] | CMT_CLK;
|
||||||
_pinMapping.cmt_cs = doc[i]["cmt"]["cs"] | CMT_CS;
|
_pinMapping.cmt_cs = doc[i]["cmt"]["cs"] | CMT_CS;
|
||||||
_pinMapping.cmt_fcs = doc[i]["cmt"]["fcs"] | CMT_FCS;
|
_pinMapping.cmt_fcs = doc[i]["cmt"]["fcs"] | CMT_FCS;
|
||||||
|
_pinMapping.cmt_gpio2 = doc[i]["cmt"]["gpio2"] | CMT_GPIO2;
|
||||||
_pinMapping.cmt_gpio3 = doc[i]["cmt"]["gpio3"] | CMT_GPIO3;
|
_pinMapping.cmt_gpio3 = doc[i]["cmt"]["gpio3"] | CMT_GPIO3;
|
||||||
_pinMapping.cmt_sdio = doc[i]["cmt"]["sdio"] | CMT_SDIO;
|
_pinMapping.cmt_sdio = doc[i]["cmt"]["sdio"] | CMT_SDIO;
|
||||||
|
|
||||||
@ -180,7 +186,6 @@ bool PinMappingClass::isValidCmt2300Config()
|
|||||||
return _pinMapping.cmt_clk >= 0
|
return _pinMapping.cmt_clk >= 0
|
||||||
&& _pinMapping.cmt_cs >= 0
|
&& _pinMapping.cmt_cs >= 0
|
||||||
&& _pinMapping.cmt_fcs >= 0
|
&& _pinMapping.cmt_fcs >= 0
|
||||||
&& _pinMapping.cmt_gpio3 >= 0
|
|
||||||
&& _pinMapping.cmt_sdio >= 0;
|
&& _pinMapping.cmt_sdio >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -52,6 +52,7 @@ void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request)
|
|||||||
cmtPinObj["cs"] = pin.cmt_cs;
|
cmtPinObj["cs"] = pin.cmt_cs;
|
||||||
cmtPinObj["fcs"] = pin.cmt_fcs;
|
cmtPinObj["fcs"] = pin.cmt_fcs;
|
||||||
cmtPinObj["sdio"] = pin.cmt_sdio;
|
cmtPinObj["sdio"] = pin.cmt_sdio;
|
||||||
|
cmtPinObj["gpio2"] = pin.cmt_gpio2;
|
||||||
cmtPinObj["gpio3"] = pin.cmt_gpio3;
|
cmtPinObj["gpio3"] = pin.cmt_gpio3;
|
||||||
|
|
||||||
JsonObject ethPinObj = curPin.createNestedObject("eth");
|
JsonObject ethPinObj = curPin.createNestedObject("eth");
|
||||||
|
|||||||
@ -12,6 +12,7 @@ export interface Cmt2300 {
|
|||||||
cs: number;
|
cs: number;
|
||||||
fcs: number;
|
fcs: number;
|
||||||
sdio: number;
|
sdio: number;
|
||||||
|
gpio2: number;
|
||||||
gpio3: number;
|
gpio3: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user