diff --git a/src/CHANGES.md b/src/CHANGES.md index ca5c40e8..e52d899c 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -2,6 +2,7 @@ ## 0.8.147 - 2024-09-29 * improved queue, added mutex +* fixed send power limit #1757 ## 0.8.146 - 2024-09-23 * fix reset ticker #1754 diff --git a/src/hm/CommQueue.h b/src/hm/CommQueue.h index a73a3370..bf2be217 100644 --- a/src/hm/CommQueue.h +++ b/src/hm/CommQueue.h @@ -1,5 +1,5 @@ //----------------------------------------------------------------------------- -// 2023 Ahoy, https://github.com/lumpapu/ahoy +// 2024 Ahoy, https://github.com/lumpapu/ahoy // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/4.0/deed //----------------------------------------------------------------------------- @@ -140,24 +140,21 @@ class CommQueue { if(this->rdPtr == this->wrPtr) cb(false, nullptr); // empty else { - //xSemaphoreTake(this->mutex, portMAX_DELAY); - //uint8_t tmp = this->rdPtr; - //xSemaphoreGive(this->mutex); - cb(true, &mQueue[this->rdPtr]); + xSemaphoreTake(this->mutex, portMAX_DELAY); + QueueElement el = mQueue[this->rdPtr]; + inc(&this->rdPtr); + xSemaphoreGive(this->mutex); + cb(true, &el); } } void cmdDone(QueueElement *q, bool keep = false) { - xSemaphoreTake(this->mutex, portMAX_DELAY); if(keep) { q->attempts = DefaultAttempts; q->attemptsMax = DefaultAttempts; - xSemaphoreGive(this->mutex); add(q); // add to the end again - xSemaphoreTake(this->mutex, portMAX_DELAY); } - inc(&this->rdPtr); - xSemaphoreGive(this->mutex); + //inc(&this->rdPtr); } private: diff --git a/src/hm/Communication.h b/src/hm/Communication.h index 1c7c83ae..48e8840e 100644 --- a/src/hm/Communication.h +++ b/src/hm/Communication.h @@ -21,7 +21,9 @@ typedef std::function *)> alarmListenerType; class Communication : public CommQueue<> { public: - Communication() : CommQueue() {} + Communication() + : CommQueue() + {} ~Communication() {} @@ -52,23 +54,29 @@ class Communication : public CommQueue<> { } void loop() { - get([this](bool valid, QueueElement *q) { - if(!valid) { - if(mPrintSequenceDuration) { - mPrintSequenceDuration = false; - DPRINT(DBG_INFO, F("com loop duration: ")); - DBGPRINT(String(millis() - mLastEmptyQueueMillis)); - DBGPRINTLN(F("ms")); - DBGPRINTLN(F("-----")); + if(States::RESET == mState) { + get([this](bool valid, QueueElement *q) { + if(!valid) { + if(mPrintSequenceDuration) { + mPrintSequenceDuration = false; + DPRINT(DBG_INFO, F("com loop duration: ")); + DBGPRINT(String(millis() - mLastEmptyQueueMillis)); + DBGPRINTLN(F("ms")); + DBGPRINTLN(F("-----")); + el.iv = nullptr; + } + return; // empty } - return; // empty - } - if(!mPrintSequenceDuration) // entry was added to the queue - mLastEmptyQueueMillis = millis(); - mPrintSequenceDuration = true; - innerLoop(q); - }); + el = *q; + if(!mPrintSequenceDuration) // entry was added to the queue + mLastEmptyQueueMillis = millis(); + mPrintSequenceDuration = true; + }); + } + + if(nullptr != el.iv) + innerLoop(&el); } private: @@ -1035,6 +1043,7 @@ class Communication : public CommQueue<> { private: States mState = States::RESET; uint32_t *mTimestamp = nullptr; + QueueElement el; bool *mPrivacyMode = nullptr, *mSerialDebug = nullptr, *mPrintWholeTrace = nullptr; TimeMonitor mWaitTime = TimeMonitor(0, true); // start as expired (due to code in RESET state) std::array mLocalBuf;