From 07afde2125a648b166186bcb3b57bd097b30c84d Mon Sep 17 00:00:00 2001 From: Felix The Cat Date: Wed, 9 Dec 2020 09:00:20 +0300 Subject: [PATCH] Moved measuring into separate thread (thus decreasing response to registers change) --- CMakeLists.txt | 3 +++ TemperatureThread.cpp | 37 +++++++++++++++++++++++++++++++++++++ TemperatureThread.h | 16 ++++++++++++++++ defrost.cpp | 33 ++++++--------------------------- 4 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 TemperatureThread.cpp create mode 100644 TemperatureThread.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1753527..9b20831 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,9 @@ ModbusServiceWorker.cpp SynchronousSocket.h SynchronousSocket.cpp +TemperatureThread.h +TemperatureThread.cpp + Thread.h Thread.cpp diff --git a/TemperatureThread.cpp b/TemperatureThread.cpp new file mode 100644 index 0000000..e78d06c --- /dev/null +++ b/TemperatureThread.cpp @@ -0,0 +1,37 @@ +#include "TemperatureThread.h" +#include "libdiff.h" + +#include + +TemperatureThread::TemperatureThread(const string &cmd) : cmd(cmd) +{ +} + +string Read(FILE *f) +{ + char buffer[256]; + string result = ""; + while (fgets(buffer, sizeof(buffer), f) != nullptr) + { + result += buffer; + } + return result; +} + +void TemperatureThread::Run() +{ + while (true) + { + float temperature = 1.5; + auto output = popen(cmd.c_str(), "r"); + if (output == nullptr) return; + string value = Read(output); + pclose(output); + temperature = atof(value.c_str()); + LockMutex(register_mutex); + registers[REGISTER_CUR_TEMP] = (int)(temperature * 100); + registers[REGISTER_SECONDARY_TEMP] = (int)(temperature * 100); + ReleaseMutex(register_mutex); + sleep(2); + } +} \ No newline at end of file diff --git a/TemperatureThread.h b/TemperatureThread.h new file mode 100644 index 0000000..13ba435 --- /dev/null +++ b/TemperatureThread.h @@ -0,0 +1,16 @@ +#ifndef TEMPERATURE_THREAD_H +#define TEMPERATURE_THREAD_H + +#include "Thread.h" +#include "globals.h" + +class TemperatureThread : public ftc::Thread +{ + string cmd; +protected: + virtual void Run() override; +public: + TemperatureThread(const string &cmd); +}; + +#endif \ No newline at end of file diff --git a/defrost.cpp b/defrost.cpp index f61cd8a..e4d126c 100644 --- a/defrost.cpp +++ b/defrost.cpp @@ -1,6 +1,7 @@ #include "configparser.h" #include "globals.h" #include "ModbusServiceListenThread.h" +#include "TemperatureThread.h" #include "libdiff.h" #include @@ -15,31 +16,6 @@ const int BASE_DEFAULT = 0x3BC; -string Read(FILE *f) -{ - char buffer[256]; - string result = ""; - while (fgets(buffer, sizeof(buffer), f) != nullptr) - { - result += buffer; - } - return result; -} - -void temperature_update(const string &cmd) -{ - // other helper variables - float temperature = 1.5; - auto output = popen(cmd.c_str(), "r"); - if (output == nullptr) return; - string value = Read(output); - pclose(output); - temperature = atof(value.c_str()); - - registers[REGISTER_CUR_TEMP] = (int)(temperature * 100); - registers[REGISTER_SECONDARY_TEMP] = (int)(temperature * 100); -} - int main(int argc, char *argv[]) { try { @@ -89,12 +65,15 @@ int main(int argc, char *argv[]) ModbusServiceListenThread *modbus_service = new ModbusServiceListenThread(&mainlog, atoi(cfg.GetParam("ListenPort").c_str())); modbus_service->Start(); + // run temperature update thread + TemperatureThread *temperature_thread = new TemperatureThread(measure_command); + temperature_thread->Start(); + int io_value = 0; - // loop forever updating the temperature values every second + // loop forever tweaking relay state according to control while (true) { LockMutex(register_mutex); - temperature_update(measure_command); int mode = registers[REGISTER_MODE]; if (mode == 0) {