diff --git a/lib/CustomOpenTherm/CustomOpenTherm.h b/lib/CustomOpenTherm/CustomOpenTherm.h index f63c72f..4eb5ecc 100644 --- a/lib/CustomOpenTherm/CustomOpenTherm.h +++ b/lib/CustomOpenTherm/CustomOpenTherm.h @@ -2,35 +2,37 @@ #include class CustomOpenTherm : public OpenTherm { -private: - unsigned long prevRequestTime = 0; - void(*handleSendRequestCallback)(unsigned long, unsigned long, OpenThermResponseStatus status, byte attempt) = nullptr; - void(*yieldCallback)(void*) = nullptr; - void* yieldArg = nullptr; - public: + typedef std::function YieldCallback; + typedef std::function BeforeSendRequestCallback; + typedef std::function AfterSendRequestCallback; + CustomOpenTherm(int inPin = 4, int outPin = 5, bool isSlave = false) : OpenTherm(inPin, outPin, isSlave) {} - void setHandleSendRequestCallback(void(*handleSendRequestCallback)(unsigned long, unsigned long, OpenThermResponseStatus status, byte attempt)) { - this->handleSendRequestCallback = handleSendRequestCallback; + + CustomOpenTherm* setYieldCallback(YieldCallback callback = nullptr) { + this->yieldCallback = callback; + + return this; } - void setYieldCallback(void(*yieldCallback)(void*)) { - this->yieldCallback = yieldCallback; - this->yieldArg = nullptr; + CustomOpenTherm* setBeforeSendRequestCallback(BeforeSendRequestCallback callback = nullptr) { + this->beforeSendRequestCallback = callback; + + return this; } - void setYieldCallback(void(*yieldCallback)(void*), void* arg) { - this->yieldCallback = yieldCallback; - this->yieldArg = arg; + CustomOpenTherm* setAfterSendRequestCallback(AfterSendRequestCallback callback = nullptr) { + this->afterSendRequestCallback = callback; + + return this; } unsigned long sendRequest(unsigned long request, byte attempts = 5, byte _attempt = 0) { _attempt++; bool antiFreeze = true; while (antiFreeze || (this->prevRequestTime > 0 && millis() - this->prevRequestTime <= 200)) { - if (this->yieldCallback != nullptr) { - this->yieldCallback(yieldArg); - + if (this->yieldCallback) { + this->yieldCallback(); } else { ::yield(); } @@ -40,6 +42,10 @@ public: } } + if (this->beforeSendRequestCallback) { + this->beforeSendRequestCallback(request, _attempt); + } + unsigned long _response; if (!sendRequestAync(request)) { _response = 0; @@ -52,9 +58,8 @@ public: break; } - if (this->yieldCallback != nullptr) { - this->yieldCallback(yieldArg); - + if (this->yieldCallback) { + this->yieldCallback(); } else { ::yield(); } @@ -65,8 +70,8 @@ public: this->prevRequestTime = millis(); OpenThermResponseStatus _responseStatus = getLastResponseStatus(); - if (this->handleSendRequestCallback != nullptr) { - this->handleSendRequestCallback(request, _response, _responseStatus, _attempt); + if (this->afterSendRequestCallback) { + this->afterSendRequestCallback(request, _response, _responseStatus, _attempt); } if (_responseStatus == OpenThermResponseStatus::SUCCESS || _responseStatus == OpenThermResponseStatus::INVALID || _attempt >= attempts) { @@ -146,4 +151,10 @@ public: int16_t value = valueHB; return ((value << 8) + valueLB); } + +protected: + YieldCallback yieldCallback; + BeforeSendRequestCallback beforeSendRequestCallback; + AfterSendRequestCallback afterSendRequestCallback; + unsigned long prevRequestTime = 0; }; diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index b23ab29..29ac1f6 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -42,10 +42,10 @@ protected: void setup() { Log.sinfoln(FPSTR(L_OT), F("Started. GPIO IN: %hhu, GPIO OUT: %hhu"), settings.opentherm.inPin, settings.opentherm.outPin); - ot->setHandleSendRequestCallback(OpenThermTask::sendRequestCallback); - ot->setYieldCallback([](void* self) { - static_cast(self)->delay(25); - }, this); + ot->setAfterSendRequestCallback(OpenThermTask::sendRequestCallback); + ot->setYieldCallback([this]() { + this->delay(25); + }); ot->begin(OpenThermTask::handleInterrupt, OpenThermTask::responseCallback); #ifdef LED_OT_RX_PIN @@ -589,7 +589,12 @@ protected: return false; } - vars.temperatures.heating = ot->getFloat(response); + float value = ot->getFloat(response); + if (value <= 0) { + return false; + } + + vars.temperatures.heating = value; return true; } @@ -600,7 +605,12 @@ protected: return false; } - vars.temperatures.dhw = ot->getFloat(response); + float value = ot->getFloat(response); + if (value <= 0) { + return false; + } + + vars.temperatures.dhw = value; return true; }