HCesp/History.h

70 lines
2.1 KiB
C++

#ifndef __HISTORY_H
#define __HISTORY_H
#include "HermitCrab.h" // Assuming CURRENT_STATUS structure is defined elsewhere
#define RING_SIZE (256 * 7)
//#define RING_MASK (RING_SIZE - 1)
class CHistory {
private:
int16_t head;
int16_t tail;
int16_t count;
STATUS_TYPE ring[RING_SIZE]; // Ring buffer
float Kp_Humidity;
float Kd_Humidity;
float LR_Humidity;
float Kp_Temp1;
float Kd_Temp1;
float LR_Temp1;
float Kp_Temp2;
float Kd_Temp2;
float LR_Temp2;
float Kp_Temp3;
float Kd_Temp3;
float LR_Temp3;
int16_t lastTemp, lastHumid;
public:
CHistory();
void loadPID();
void savePID();
void init(int16_t lastTemp, int16_t lastHumid);
inline float getKpTemperature() { return Kp_Temp1;}
inline float getKdTemperature() { return Kd_Temp1;}
inline float getLRTemperature() { return LR_Temp1;}
inline float getKpHumidity() { return Kp_Humidity;}
inline float getKdHumidity() { return Kd_Humidity;}
inline float getLRHumidity() { return LR_Humidity;}
inline float getKpHeater1() { return Kp_Temp1; }
inline float getKdHeater1() { return Kd_Temp1; }
inline float getKpMist() { return Kp_Humidity; }
inline float getKdMist() { return Kd_Humidity; }
int16_t add(STATUS_TYPE &status);
int16_t calculateDutyForTemp1(int16_t setPoint, int16_t curTemp, int16_t lastDuty);
int16_t calculateDutyForTemp2(int16_t setPoint, int16_t curTemp, int16_t lastDuty);
int16_t calculateMistDuty(uint16_t setPpoint, uint16_t curHumid, int16_t lastDuty);
inline int16_t getRingCount() { return count; };
inline int16_t getRingSize() { return RING_SIZE; }
inline uint8_t *getRingData1() { return (uint8_t *) &ring[tail]; }
inline uint8_t *getRingData2() { return (uint8_t *) &ring[0]; }
inline int16_t getRingHead() { return head; }
inline int16_t getRingTail() { return tail; }
private:
void adjustGainsUsingGradientDescent(float &Kp, float &Kd, float currentError, uint16_t setpoint, float prevTemperature, float MAX_EXPECTED_ERROR);
};
extern CHistory history;
#endif // CHISTORY_H