refactoring

This commit is contained in:
Yurii
2023-12-01 14:35:13 +03:00
parent 522f8ec699
commit ff91e328cb

View File

@@ -3,10 +3,10 @@
class CustomOpenTherm : public OpenTherm { class CustomOpenTherm : public OpenTherm {
private: private:
unsigned long send_ts = millis(); unsigned long prevRequestTime = 0;
void(*handleSendRequestCallback)(unsigned long, unsigned long, OpenThermResponseStatus status, byte attempt); void(*handleSendRequestCallback)(unsigned long, unsigned long, OpenThermResponseStatus status, byte attempt) = nullptr;
void(*yieldCallback)(void*); void(*yieldCallback)(void*) = nullptr;
void* yieldArg; void* yieldArg = nullptr;
public: public:
CustomOpenTherm(int inPin = 4, int outPin = 5, bool isSlave = false) : OpenTherm(inPin, outPin, isSlave) {} CustomOpenTherm(int inPin = 4, int outPin = 5, bool isSlave = false) : OpenTherm(inPin, outPin, isSlave) {}
@@ -26,22 +26,28 @@ public:
unsigned long sendRequest(unsigned long request, byte attempts = 5, byte _attempt = 0) { unsigned long sendRequest(unsigned long request, byte attempts = 5, byte _attempt = 0) {
_attempt++; _attempt++;
while (send_ts > 0 && millis() - send_ts < 200) { bool antiFreeze = true;
if (yieldCallback != NULL) { while (antiFreeze || (this->prevRequestTime > 0 && millis() - this->prevRequestTime <= 200)) {
yieldCallback(yieldArg); if (this->yieldCallback != nullptr) {
this->yieldCallback(yieldArg);
} else { } else {
::yield(); ::yield();
} }
if (antiFreeze) {
antiFreeze = false;
}
} }
unsigned long _response; unsigned long _response;
if (!sendRequestAync(request)) { if (!sendRequestAync(request)) {
_response = 0; _response = 0;
} else { } else {
while (!isReady()) { while (!isReady()) {
if (yieldCallback != NULL) { if (this->yieldCallback != nullptr) {
yieldCallback(yieldArg); this->yieldCallback(yieldArg);
} else { } else {
::yield(); ::yield();
@@ -52,15 +58,16 @@ public:
_response = getLastResponse(); _response = getLastResponse();
} }
this->prevRequestTime = millis();
OpenThermResponseStatus _responseStatus = getLastResponseStatus(); OpenThermResponseStatus _responseStatus = getLastResponseStatus();
if (handleSendRequestCallback != NULL) { if (this->handleSendRequestCallback != nullptr) {
handleSendRequestCallback(request, _response, _responseStatus, _attempt); this->handleSendRequestCallback(request, _response, _responseStatus, _attempt);
} }
send_ts = millis();
if (_responseStatus == OpenThermResponseStatus::SUCCESS || _responseStatus == OpenThermResponseStatus::INVALID || _attempt >= attempts) { if (_responseStatus == OpenThermResponseStatus::SUCCESS || _responseStatus == OpenThermResponseStatus::INVALID || _attempt >= attempts) {
return _response; return _response;
} else { } else {
return sendRequest(request, attempts, _attempt); return sendRequest(request, attempts, _attempt);
} }