#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