| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | 
							- // model-based temperature safety checker declarations
 
- #ifndef TEMP_MGR_INTV
 
- #error "this file is not a public interface, it should be used *only* within temperature.cpp!"
 
- #endif
 
- #include "planner.h"
 
- constexpr uint8_t TEMP_MODEL_CAL_S = 60;     // Maximum recording length during calibration (s)
 
- constexpr uint8_t TEMP_MODEL_CAL_R_STEP = 4; // Fan interpolation steps during calibration
 
- constexpr float TEMP_MODEL_fS = 0.065;       // simulation filter (1st-order IIR factor)
 
- constexpr float TEMP_MODEL_fE = 0.05;        // error filter (1st-order IIR factor)
 
- // transport delay buffer size (samples)
 
- constexpr uint8_t TEMP_MODEL_LAG_SIZE = (TEMP_MODEL_LAG / TEMP_MGR_INTV + 0.5);
 
- // resistance values for all fan levels
 
- constexpr uint8_t TEMP_MODEL_R_SIZE = (1 << FAN_SOFT_PWM_BITS);
 
- static const float TEMP_MODEL_R_DEFAULT[TEMP_MODEL_R_SIZE] PROGMEM = TEMP_MODEL_Rv;
 
- namespace temp_model {
 
- struct model_data
 
- {
 
-     // temporary buffers
 
-     float dT_lag_buf[TEMP_MODEL_LAG_SIZE]; // transport delay buffer
 
-     uint8_t dT_lag_idx = 0;                // transport delay buffer index
 
-     float dT_err_prev = 0;                 // previous temperature delta error
 
-     float T_prev = 0;                      // last temperature extruder
 
-     // configurable parameters
 
-     float P;                               // heater power (W)
 
-     float C;                               // heatblock capacitance (J/K)
 
-     float R[TEMP_MODEL_R_SIZE];            // heatblock resistance for all fan levels (K/W)
 
-     float Ta_corr;                         // ambient temperature correction (K)
 
-     // thresholds
 
-     float warn;                            // warning threshold (K/s)
 
-     float err;                             // error threshold (K/s)
 
-     // status flags
 
-     union
 
-     {
 
-         bool flags;
 
-         struct
 
-         {
 
-             bool uninitialized: 1;         // model is not initialized
 
-             bool error: 1;                 // error threshold set
 
-             bool warning: 1;               // warning threshold set
 
-         } flag_bits;
 
-     };
 
-     // pre-computed values (initialized via reset)
 
-     float C_i;                             // heatblock capacitance (precomputed dT/C)
 
-     float warn_s;                          // warning threshold (per sample)
 
-     float err_s;                           // error threshold (per sample)
 
-     // simulation functions
 
-     void reset(uint8_t heater_pwm, uint8_t fan_pwm, float heater_temp, float ambient_temp);
 
-     void step(uint8_t heater_pwm, uint8_t fan_pwm, float heater_temp, float ambient_temp);
 
- };
 
- static bool enabled;          // model check enabled
 
- static bool warn_beep = true; // beep on warning threshold
 
- static model_data data;       // default heater data
 
- static bool calibrated(); // return calibration/model validity status
 
- static void check();      // check and trigger errors or warnings based on current state
 
- // warning state (updated from from isr context)
 
- volatile static struct
 
- {
 
-     float dT_err;    // temperature delta error (per sample)
 
-     bool warning: 1; // warning condition
 
-     bool assert: 1;  // warning is still asserted
 
- } warning_state;
 
- static void handle_warning(); // handle warnings from user context
 
- #ifdef TEMP_MODEL_DEBUG
 
- static struct
 
- {
 
-     volatile struct
 
-     {
 
-         uint32_t stamp;
 
-         int8_t delta_ms;
 
-         uint8_t counter;
 
-         uint8_t cur_pwm;
 
-         float cur_temp;
 
-         float cur_amb;
 
-     } entry;
 
-     uint8_t serial;
 
-     bool enabled;
 
- } log_buf;
 
- static void log_usr(); // user log handler
 
- static void log_isr(); // isr log handler
 
- #endif
 
- } // namespace temp_model
 
- namespace temp_model_cal {
 
- // recording scratch buffer
 
- struct rec_entry
 
- {
 
-     float temp;  // heater temperature
 
-     uint8_t pwm; // heater PWM
 
- };
 
- constexpr uint16_t REC_BUFFER_SIZE = TEMP_MODEL_CAL_S / TEMP_MGR_INTV;
 
- static rec_entry* const rec_buffer = (rec_entry*)block_buffer; // oh-hey, free memory!
 
- static_assert(sizeof(rec_entry[REC_BUFFER_SIZE]) <= sizeof(block_buffer),
 
-     "recording length too long to fit within available buffer");
 
- } // namespace temp_model_cal
 
 
  |