From 9bb7a06b8351a5646da12e4225056b0c6e8241e3 Mon Sep 17 00:00:00 2001
From: Pascal <engelerp@phys.ethz.ch>
Date: Tue, 13 Jun 2023 16:56:41 +0200
Subject: [PATCH] Added turn on/off functionality

---
 .../drivers/pid_controller/pid_controller.cpp     | 15 +++++++++++++++
 .../drivers/pid_controller/pid_controller.hpp     |  5 +++++
 2 files changed, 20 insertions(+)

diff --git a/firmware/drivers/pid_controller/pid_controller.cpp b/firmware/drivers/pid_controller/pid_controller.cpp
index a5d77c5..a0132eb 100644
--- a/firmware/drivers/pid_controller/pid_controller.cpp
+++ b/firmware/drivers/pid_controller/pid_controller.cpp
@@ -23,6 +23,7 @@ std::vector<double> Pid_controller::pid_vec_ = {0., 0., 0.}; //current values of
 std::vector<double> Pid_controller::kpid_vec_ = {0., 0., 0.}; //coefficients Kp Ki Kd
 double Pid_controller::I_reset_ = 0.; //reset value of I
 double Pid_controller::I_reset_errsq_ = 0.5; //value of error*error above which the I-term is held in reset
+bool Pid_controller::enabled_ = true;
 
 
 void Pid_controller::init(double setpoint, std::vector<double> kpid, double I_reset, double I_reset_errsq){
@@ -33,6 +34,11 @@ void Pid_controller::init(double setpoint, std::vector<double> kpid, double I_re
 }
 
 void Pid_controller::update_pid(double temperature){
+    if(!enabled_){ //if we have been turned off, stay off
+        output_ = 0.09;
+        Ltc6992::set_level(output_);
+        return;
+    }
     //calculate error from setpoint
     double error = setpoint_ - temperature;
     //update P,I,D
@@ -92,3 +98,12 @@ double Pid_controller::get_I_reset(){
 double Pid_controller::get_setpoint(){
     return setpoint_;
 }
+
+void Pid_controller::turn_off(){
+    output_ = 0.09;
+    enabled_ = false;
+}
+
+void Pid_controller::turn_on(){
+    enabled_ = true;
+}
\ No newline at end of file
diff --git a/firmware/drivers/pid_controller/pid_controller.hpp b/firmware/drivers/pid_controller/pid_controller.hpp
index 4c5bd04..55e53e8 100644
--- a/firmware/drivers/pid_controller/pid_controller.hpp
+++ b/firmware/drivers/pid_controller/pid_controller.hpp
@@ -21,6 +21,9 @@ public:
     static double get_I_reset();
     static double get_setpoint();
 
+    static void turn_off();
+    static void turn_on();
+
 private:
     static double setpoint_; //target temperature in °C
     static double output_; //output to LTC6992
@@ -28,6 +31,8 @@ private:
     static std::vector<double> kpid_vec_; //coefficients Kp Ki Kd
     static double I_reset_; //reset value of I
     static double I_reset_errsq_; //value of error*error above which the I-term is held in reset
+    
+    static bool enabled_;
 };
 
 #endif
-- 
GitLab