Skip to content

Commit 46b29a4

Browse files
ihormelnykKitsok
andauthored
1. Fixup reorder error; 2. Cosmetics Pr/22 (#23)
* 1. Fixup reorder error (Issue Re-Order Error using platformio #20); 2. Clean up cosmetics: tabs vs. spaces, trailing spaces * Add helper functions to get return temperature, modulation level, pressure and fault code Co-authored-by: Konstantin Klubnichkin <kitsok@yandex-team.ru>
1 parent 996d8fc commit 46b29a4

File tree

2 files changed

+150
-131
lines changed

2 files changed

+150
-131
lines changed

src/OpenTherm.cpp

Lines changed: 80 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ Copyright 2018, Ihor Melnyk
66
#include "OpenTherm.h"
77

88
OpenTherm::OpenTherm(int inPin, int outPin, bool isSlave):
9+
status(OpenThermStatus::NOT_INITIALIZED),
910
inPin(inPin),
1011
outPin(outPin),
11-
isSlave(isSlave),
12-
status(OpenThermStatus::NOT_INITIALIZED),
12+
isSlave(isSlave),
1313
response(0),
1414
responseStatus(OpenThermResponseStatus::NONE),
1515
responseTimestamp(0),
@@ -24,16 +24,16 @@ void OpenTherm::begin(void(*handleInterruptCallback)(void), void(*processRespons
2424
pinMode(outPin, OUTPUT);
2525
if (handleInterruptCallback != NULL) {
2626
this->handleInterruptCallback = handleInterruptCallback;
27-
attachInterrupt(digitalPinToInterrupt(inPin), handleInterruptCallback, CHANGE);
27+
attachInterrupt(digitalPinToInterrupt(inPin), handleInterruptCallback, CHANGE);
2828
}
2929
activateBoiler();
3030
status = OpenThermStatus::READY;
31-
this->processResponseCallback = processResponseCallback;
31+
this->processResponseCallback = processResponseCallback;
3232
}
3333

3434
void OpenTherm::begin(void(*handleInterruptCallback)(void))
3535
{
36-
begin(handleInterruptCallback, NULL);
36+
begin(handleInterruptCallback, NULL);
3737
}
3838

3939
bool ICACHE_RAM_ATTR OpenTherm::isReady()
@@ -66,7 +66,7 @@ void OpenTherm::sendBit(bool high) {
6666
}
6767

6868
bool OpenTherm::sendRequestAync(unsigned long request)
69-
{
69+
{
7070
//Serial.println("Request: " + String(request, HEX));
7171
noInterrupts();
7272
const bool ready = isReady();
@@ -83,21 +83,21 @@ bool OpenTherm::sendRequestAync(unsigned long request)
8383
for (int i = 31; i >= 0; i--) {
8484
sendBit(bitRead(request, i));
8585
}
86-
sendBit(HIGH); //stop bit
86+
sendBit(HIGH); //stop bit
8787
setIdleState();
8888

89-
status = OpenThermStatus::RESPONSE_WAITING;
90-
responseTimestamp = micros();
89+
status = OpenThermStatus::RESPONSE_WAITING;
90+
responseTimestamp = micros();
9191
return true;
9292
}
9393

9494
unsigned long OpenTherm::sendRequest(unsigned long request)
95-
{
95+
{
9696
if (!sendRequestAync(request)) return 0;
9797
while (!isReady()) {
9898
process();
9999
yield();
100-
}
100+
}
101101
return response;
102102
}
103103

@@ -111,9 +111,9 @@ bool OpenTherm::sendResponse(unsigned long request)
111111
for (int i = 31; i >= 0; i--) {
112112
sendBit(bitRead(request, i));
113113
}
114-
sendBit(HIGH); //stop bit
114+
sendBit(HIGH); //stop bit
115115
setIdleState();
116-
status = OpenThermStatus::READY;
116+
status = OpenThermStatus::READY;
117117
return true;
118118
}
119119

@@ -123,16 +123,16 @@ OpenThermResponseStatus OpenTherm::getLastResponseStatus()
123123
}
124124

125125
void ICACHE_RAM_ATTR OpenTherm::handleInterrupt()
126-
{
127-
if (isReady())
128-
{
129-
if (isSlave && readState() == HIGH) {
130-
status = OpenThermStatus::RESPONSE_WAITING;
131-
}
132-
else {
133-
return;
134-
}
135-
}
126+
{
127+
if (isReady())
128+
{
129+
if (isSlave && readState() == HIGH) {
130+
status = OpenThermStatus::RESPONSE_WAITING;
131+
}
132+
else {
133+
return;
134+
}
135+
}
136136

137137
unsigned long newTs = micros();
138138
if (status == OpenThermStatus::RESPONSE_WAITING) {
@@ -151,7 +151,7 @@ void ICACHE_RAM_ATTR OpenTherm::handleInterrupt()
151151
responseTimestamp = newTs;
152152
responseBitIndex = 0;
153153
}
154-
else {
154+
else {
155155
status = OpenThermStatus::RESPONSE_INVALID;
156156
responseTimestamp = newTs;
157157
}
@@ -172,40 +172,40 @@ void ICACHE_RAM_ATTR OpenTherm::handleInterrupt()
172172
}
173173

174174
void OpenTherm::process()
175-
{
175+
{
176176
noInterrupts();
177177
OpenThermStatus st = status;
178178
unsigned long ts = responseTimestamp;
179-
interrupts();
179+
interrupts();
180180

181181
if (st == OpenThermStatus::READY) return;
182182
unsigned long newTs = micros();
183183
if (st != OpenThermStatus::NOT_INITIALIZED && (newTs - ts) > 1000000) {
184-
status = OpenThermStatus::READY;
184+
status = OpenThermStatus::READY;
185185
responseStatus = OpenThermResponseStatus::TIMEOUT;
186186
if (processResponseCallback != NULL) {
187187
processResponseCallback(response, responseStatus);
188-
}
189-
}
190-
else if (st == OpenThermStatus::RESPONSE_INVALID) {
191-
status = OpenThermStatus::DELAY;
188+
}
189+
}
190+
else if (st == OpenThermStatus::RESPONSE_INVALID) {
191+
status = OpenThermStatus::DELAY;
192192
responseStatus = OpenThermResponseStatus::INVALID;
193193
if (processResponseCallback != NULL) {
194194
processResponseCallback(response, responseStatus);
195-
}
195+
}
196196
}
197197
else if (st == OpenThermStatus::RESPONSE_READY) {
198-
status = OpenThermStatus::DELAY;
198+
status = OpenThermStatus::DELAY;
199199
responseStatus = (isSlave ? isValidRequest(response) : isValidResponse(response)) ? OpenThermResponseStatus::SUCCESS : OpenThermResponseStatus::INVALID;
200200
if (processResponseCallback != NULL) {
201201
processResponseCallback(response, responseStatus);
202-
}
202+
}
203203
}
204204
else if (st == OpenThermStatus::DELAY) {
205205
if ((newTs - ts) > 100000) {
206206
status = OpenThermStatus::READY;
207207
}
208-
}
208+
}
209209
}
210210

211211
bool OpenTherm::parity(unsigned long frame) //odd parity
@@ -221,13 +221,13 @@ bool OpenTherm::parity(unsigned long frame) //odd parity
221221

222222
OpenThermMessageType OpenTherm::getMessageType(unsigned long message)
223223
{
224-
OpenThermMessageType msg_type = static_cast<OpenThermMessageType>((message >> 28) & 7);
225-
return msg_type;
224+
OpenThermMessageType msg_type = static_cast<OpenThermMessageType>((message >> 28) & 7);
225+
return msg_type;
226226
}
227227

228228
OpenThermMessageID OpenTherm::getDataID(unsigned long frame)
229229
{
230-
return (OpenThermMessageID)((frame >> 16) & 0xFF);
230+
return (OpenThermMessageID)((frame >> 16) & 0xFF);
231231
}
232232

233233
unsigned long OpenTherm::buildRequest(OpenThermMessageType type, OpenThermMessageID id, unsigned int data)
@@ -243,11 +243,11 @@ unsigned long OpenTherm::buildRequest(OpenThermMessageType type, OpenThermMessag
243243

244244
unsigned long OpenTherm::buildResponse(OpenThermMessageType type, OpenThermMessageID id, unsigned int data)
245245
{
246-
unsigned long response = data;
247-
response |= type << 28;
248-
response |= ((unsigned long)id) << 16;
249-
if (parity(response)) response |= (1ul << 31);
250-
return response;
246+
unsigned long response = data;
247+
response |= type << 28;
248+
response |= ((unsigned long)id) << 16;
249+
if (parity(response)) response |= (1ul << 31);
250+
return response;
251251
}
252252

253253
bool OpenTherm::isValidResponse(unsigned long response)
@@ -259,48 +259,48 @@ bool OpenTherm::isValidResponse(unsigned long response)
259259

260260
bool OpenTherm::isValidRequest(unsigned long request)
261261
{
262-
if (parity(request)) return false;
263-
byte msgType = (request << 1) >> 29;
264-
return msgType == READ_DATA || msgType == WRITE_DATA;
262+
if (parity(request)) return false;
263+
byte msgType = (request << 1) >> 29;
264+
return msgType == READ_DATA || msgType == WRITE_DATA;
265265
}
266266

267267
void OpenTherm::end() {
268-
if (this->handleInterruptCallback != NULL) {
268+
if (this->handleInterruptCallback != NULL) {
269269
detachInterrupt(digitalPinToInterrupt(inPin));
270270
}
271271
}
272272

273273
const char *OpenTherm::statusToString(OpenThermResponseStatus status)
274274
{
275275
switch (status) {
276-
case NONE: return "NONE";
276+
case NONE: return "NONE";
277277
case SUCCESS: return "SUCCESS";
278278
case INVALID: return "INVALID";
279279
case TIMEOUT: return "TIMEOUT";
280-
default: return "UNKNOWN";
280+
default: return "UNKNOWN";
281281
}
282282
}
283283

284284
const char *OpenTherm::messageTypeToString(OpenThermMessageType message_type)
285285
{
286286
switch (message_type) {
287-
case READ_DATA: return "READ_DATA";
288-
case WRITE_DATA: return "WRITE_DATA";
289-
case INVALID_DATA: return "INVALID_DATA";
290-
case RESERVED: return "RESERVED";
291-
case READ_ACK: return "READ_ACK";
292-
case WRITE_ACK: return "WRITE_ACK";
293-
case DATA_INVALID: return "DATA_INVALID";
287+
case READ_DATA: return "READ_DATA";
288+
case WRITE_DATA: return "WRITE_DATA";
289+
case INVALID_DATA: return "INVALID_DATA";
290+
case RESERVED: return "RESERVED";
291+
case READ_ACK: return "READ_ACK";
292+
case WRITE_ACK: return "WRITE_ACK";
293+
case DATA_INVALID: return "DATA_INVALID";
294294
case UNKNOWN_DATA_ID: return "UNKNOWN_DATA_ID";
295-
default: return "UNKNOWN";
295+
default: return "UNKNOWN";
296296
}
297297
}
298298

299299
//building requests
300300

301301
unsigned long OpenTherm::buildSetBoilerStatusRequest(bool enableCentralHeating, bool enableHotWater, bool enableCooling, bool enableOutsideTemperatureCompensation, bool enableCentralHeating2) {
302302
unsigned int data = enableCentralHeating | (enableHotWater << 1) | (enableCooling << 2) | (enableOutsideTemperatureCompensation << 3) | (enableCentralHeating2 << 4);
303-
data <<= 8;
303+
data <<= 8;
304304
return buildRequest(OpenThermMessageType::READ_DATA, OpenThermMessageID::Status, data);
305305
}
306306

@@ -349,11 +349,6 @@ float OpenTherm::getFloat(const unsigned long response) const {
349349
return f;
350350
}
351351

352-
float OpenTherm::getTemperature(unsigned long response) {
353-
float temperature = isValidResponse(response) ? getFloat(response) : 0;
354-
return temperature;
355-
}
356-
357352
unsigned int OpenTherm::temperatureToData(float temperature) {
358353
if (temperature < 0) temperature = 0;
359354
if (temperature > 100) temperature = 100;
@@ -363,8 +358,8 @@ unsigned int OpenTherm::temperatureToData(float temperature) {
363358

364359
//basic requests
365360

366-
unsigned long OpenTherm::setBoilerStatus(bool enableCentralHeating, bool enableHotWater, bool enableCooling, bool enableOutsideTemperatureCompensation, bool enableCentralHeating2) {
367-
return sendRequest(buildSetBoilerStatusRequest(enableCentralHeating, enableHotWater, enableCooling, enableOutsideTemperatureCompensation, enableCentralHeating2));
361+
unsigned long OpenTherm::setBoilerStatus(bool enableCentralHeating, bool enableHotWater, bool enableCooling, bool enableOutsideTemperatureCompensation, bool enableCentralHeating2) {
362+
return sendRequest(buildSetBoilerStatusRequest(enableCentralHeating, enableHotWater, enableCooling, enableOutsideTemperatureCompensation, enableCentralHeating2));
368363
}
369364

370365
bool OpenTherm::setBoilerTemperature(float temperature) {
@@ -374,5 +369,24 @@ bool OpenTherm::setBoilerTemperature(float temperature) {
374369

375370
float OpenTherm::getBoilerTemperature() {
376371
unsigned long response = sendRequest(buildGetBoilerTemperatureRequest());
377-
return getTemperature(response);
372+
return isValidResponse(response) ? getFloat(response) : 0;
373+
}
374+
375+
float OpenTherm::getReturnTemperature() {
376+
unsigned long response = sendRequest(buildRequest(OpenThermRequestType::READ, OpenThermMessageID::Tret, 0));
377+
return isValidResponse(response) ? getFloat(response) : 0;
378+
}
379+
380+
float OpenTherm::getModulation() {
381+
unsigned long response = sendRequest(buildRequest(OpenThermRequestType::READ, OpenThermMessageID::RelModLevel, 0));
382+
return isValidResponse(response) ? getFloat(response) : 0;
383+
}
384+
385+
float OpenTherm::getPressure() {
386+
unsigned long response = sendRequest(buildRequest(OpenThermRequestType::READ, OpenThermMessageID::CHPressure, 0));
387+
return isValidResponse(response) ? getFloat(response) : 0;
388+
}
389+
390+
unsigned char OpenTherm::getFault() {
391+
return ((sendRequest(buildRequest(OpenThermRequestType::READ, OpenThermMessageID::ASFflags, 0)) >> 8) & 0xff);
378392
}

0 commit comments

Comments
 (0)