diff --git a/lib/Hoymiles/src/HoymilesRadio.cpp b/lib/Hoymiles/src/HoymilesRadio.cpp index 8616b23..a4ec951 100644 --- a/lib/Hoymiles/src/HoymilesRadio.cpp +++ b/lib/Hoymiles/src/HoymilesRadio.cpp @@ -114,6 +114,13 @@ void HoymilesRadio::loop() _busyFlag = false; } } + } else if (!_busyFlag) { + // Currently in idle mode --> send packet if one is in the queue + if (!_txBuffer.empty()) { + inverter_transaction_t* t = _txBuffer.getBack(); + sendEsbPacket(t->target, t->mainCmd, t->subCmd, t->payload, t->len, t->timeout); + _txBuffer.popBack(); + } } } @@ -246,19 +253,31 @@ void HoymilesRadio::sendEsbPacket(serial_u target, uint8_t mainCmd, uint8_t subC openReadingPipe(); _radio->setChannel(getRxNxtChannel()); _radio->startListening(); + _activeSerial = target; _busyFlag = true; _rxTimeout.set(timeout); } +bool HoymilesRadio::enqueTransaction(inverter_transaction_t* transaction) +{ + if (!_txBuffer.full()) { + inverter_transaction_t* t; + t = _txBuffer.getFront(); + memcpy(t, transaction, sizeof(inverter_transaction_t)); + _txBuffer.pushFront(t); + return true; + } else { + Serial.println(F("TX Buffer full")); + } + + return false; +} + void HoymilesRadio::sendTimePacket(std::shared_ptr iv) { inverter_transaction_t payload; if (iv->getStatsRequest(&payload)) { - serial_u s; - s.u64 = iv->serial(); - _activeSerial.u64 = iv->serial(); - - sendEsbPacket(s, payload.mainCmd, payload.subCmd, payload.payload, payload.len, payload.timeout); + enqueTransaction(&payload); } } diff --git a/lib/Hoymiles/src/HoymilesRadio.h b/lib/Hoymiles/src/HoymilesRadio.h index 534cd7f..724b18a 100644 --- a/lib/Hoymiles/src/HoymilesRadio.h +++ b/lib/Hoymiles/src/HoymilesRadio.h @@ -11,6 +11,8 @@ // number of fragments hold in buffer #define FRAGMENT_BUFFER_SIZE 30 +#define TX_BUFFER_SIZE 5 + #define MAX_RESEND_COUNT 3 class HoymilesRadio { @@ -27,6 +29,7 @@ public: void sendTimePacket(std::shared_ptr iv); void sendRetransmitPacket(uint8_t fragment_id); void sendLastPacketAgain(); + bool enqueTransaction(inverter_transaction_t* transaction); static void u32CpyLittleEndian(uint8_t dest[], uint32_t src); @@ -60,4 +63,5 @@ private: bool _busyFlag = false; inverter_transaction_t currentTransaction; + CircularBuffer _txBuffer; }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.cpp b/lib/Hoymiles/src/inverters/HM_Abstract.cpp index d52ed67..84794c5 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HM_Abstract.cpp @@ -12,6 +12,7 @@ bool HM_Abstract::getStatsRequest(inverter_transaction_t* payload) memset(payload->payload, 0, MAX_RF_PAYLOAD_SIZE); + payload->target.u64 = serial(); payload->mainCmd = 0x15; payload->subCmd = 0x80; payload->timeout = 200;