summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/HvacService.cpp82
-rw-r--r--src/HvacService.h15
-rw-r--r--src/KuksaClient.cpp7
-rw-r--r--src/KuksaClient.h1
4 files changed, 104 insertions, 1 deletions
diff --git a/src/HvacService.cpp b/src/HvacService.cpp
index 455f4ee..b909758 100644
--- a/src/HvacService.cpp
+++ b/src/HvacService.cpp
@@ -10,7 +10,6 @@
#include <iostream>
#include <algorithm>
-
HvacService::HvacService(const KuksaConfig &config, GMainLoop *loop) :
m_loop(loop),
m_config(config),
@@ -55,6 +54,10 @@ HvacService::HvacService(const KuksaConfig &config, GMainLoop *loop) :
signals["Vehicle.Cabin.HVAC.Station.Row1.Driver.FanSpeed"] = true;
signals["Vehicle.Cabin.HVAC.Station.Row1.Passenger.Temperature"] = true;
signals["Vehicle.Cabin.HVAC.Station.Row1.Passenger.FanSpeed"] = true;
+ signals["Vehicle.Cabin.HVAC.IsAirConditioningActive"] = true;
+ signals["Vehicle.Cabin.HVAC.IsFrontDefrosterActive"] = true;
+ signals["Vehicle.Cabin.HVAC.IsRearDefrosterActive"] = true;
+ signals["Vehicle.Cabin.HVAC.IsRecirculationActive"] = true;
m_broker->subscribe(signals,
[this](const std::string &path, const Datapoint &dp) {
HandleSignalChange(path, dp);
@@ -101,6 +104,22 @@ void HvacService::HandleSignalChange(const std::string &path, const Datapoint &d
if (speed >= 0 && speed <= 100)
set_right_fan_speed(speed);
}
+ } else if (path == "Vehicle.Cabin.HVAC.IsAirConditioningActive") {
+ if (dp.has_bool_()) {
+ set_ac_active(dp.bool_());
+ }
+ } else if (path == "Vehicle.Cabin.HVAC.IsFrontDefrosterActive") {
+ if (dp.has_bool_()) {
+ set_front_defrost_active(dp.bool_());
+ }
+ } else if (path == "Vehicle.Cabin.HVAC.IsRearDefrosterActive") {
+ if (dp.has_bool_()) {
+ set_rear_defrost_active(dp.bool_());
+ }
+ } else if (path == "Vehicle.Cabin.HVAC.IsRecirculationActive") {
+ if (dp.has_bool_()) {
+ set_recirculation_active(dp.bool_());
+ }
}
// else ignore
}
@@ -221,3 +240,64 @@ void HvacService::set_fan_speed(uint8_t speed)
{
m_can_helper.set_fan_speed(speed);
}
+
+void HvacService::set_ac_active(bool active)
+{
+ const std::lock_guard<std::mutex> lock(m_hvac_state_mutex);
+ if (m_IsAirConditioningActive != active) {
+ m_IsAirConditioningActive = active;
+
+ // Push out new value
+ m_broker->set("Vehicle.Cabin.HVAC.IsAirConditioningActive",
+ active,
+ [this](const std::string &path, const Error &error) {
+ HandleSignalSetError(path, error);
+ });
+ }
+}
+
+void HvacService::set_front_defrost_active(bool active)
+{
+ const std::lock_guard<std::mutex> lock(m_hvac_state_mutex);
+ if (m_IsFrontDefrosterActive != active) {
+ m_IsFrontDefrosterActive = active;
+
+ // Push out new value
+ m_broker->set("Vehicle.Cabin.HVAC.IsFrontDefrosterActive",
+ active,
+ [this](const std::string &path, const Error &error) {
+ HandleSignalSetError(path, error);
+ });
+ }
+}
+
+void HvacService::set_rear_defrost_active(bool active)
+{
+ const std::lock_guard<std::mutex> lock(m_hvac_state_mutex);
+ if (m_IsRearDefrosterActive != active) {
+ m_IsRearDefrosterActive = active;
+
+ // Push out new value
+ m_broker->set("Vehicle.Cabin.HVAC.IsRearDefrosterActive",
+ active,
+ [this](const std::string &path, const Error &error) {
+ HandleSignalSetError(path, error);
+ });
+ }
+}
+
+void HvacService::set_recirculation_active(bool active)
+{
+ const std::lock_guard<std::mutex> lock(m_hvac_state_mutex);
+ if (m_IsRecirculationActive != active) {
+ m_IsRecirculationActive = active;
+
+ // Push out new value
+ m_broker->set("Vehicle.Cabin.HVAC.IsRecirculationActive",
+ active,
+ [this](const std::string &path, const Error &error) {
+ HandleSignalSetError(path, error);
+ });
+ }
+}
+
diff --git a/src/HvacService.h b/src/HvacService.h
index 756f6f3..44cb2cc 100644
--- a/src/HvacService.h
+++ b/src/HvacService.h
@@ -7,6 +7,7 @@
#ifndef _HVAC_SERVICE_H
#define _HVAC_SERVICE_H
+#include <mutex>
#include <glib.h>
#include "KuksaConfig.h"
@@ -43,6 +44,12 @@ private:
HvacCanHelper m_can_helper;
HvacLedHelper m_led_helper;
+ std::mutex m_hvac_state_mutex;
+ bool m_IsAirConditioningActive = false;
+ bool m_IsFrontDefrosterActive = false;
+ bool m_IsRearDefrosterActive = false;
+ bool m_IsRecirculationActive = false;
+
void HandleSignalChange(const std::string &path, const Datapoint &dp);
void HandleSignalSetError(const std::string &path, const Error &error);
@@ -60,6 +67,14 @@ private:
void set_right_fan_speed(uint8_t temp);
void set_fan_speed(uint8_t temp);
+
+ void set_ac_active(bool active);
+
+ void set_front_defrost_active(bool active);
+
+ void set_rear_defrost_active(bool active);
+
+ void set_recirculation_active(bool active);
};
#endif // _HVAC_SERVICE_H
diff --git a/src/KuksaClient.cpp b/src/KuksaClient.cpp
index 844ce0e..e7e2e25 100644
--- a/src/KuksaClient.cpp
+++ b/src/KuksaClient.cpp
@@ -73,6 +73,13 @@ void KuksaClient::set(const std::string &path, const std::string &value, SetResp
set(path, dp, cb, actuator);
}
+void KuksaClient::set(const std::string &path, const bool value, SetResponseCallback cb, const bool actuator)
+{
+ Datapoint dp;
+ dp.set_bool_(value);
+ set(path, dp, cb, actuator);
+}
+
void KuksaClient::set(const std::string &path, const int8_t value, SetResponseCallback cb, const bool actuator)
{
Datapoint dp;
diff --git a/src/KuksaClient.h b/src/KuksaClient.h
index fd9a9e0..a5f901e 100644
--- a/src/KuksaClient.h
+++ b/src/KuksaClient.h
@@ -36,6 +36,7 @@ public:
void get(const std::string &path, GetResponseCallback cb, const bool actuator = false);
void set(const std::string &path, const std::string &value, SetResponseCallback cb, const bool actuator = false);
+ void set(const std::string &path, const bool value, SetResponseCallback cb, const bool actuator = false);
void set(const std::string &path, const int8_t value, SetResponseCallback cb, const bool actuator = false);
void set(const std::string &path, const int16_t value, SetResponseCallback cb, const bool actuator = false);
void set(const std::string &path, const int32_t value, SetResponseCallback cb, const bool actuator = false);