#ifndef PID_CONTROLLER_H
#define PID_CONTROLLER_H

#include <stdint.h>

typedef struct
{
    float target;
    float measurement;
    float output;

    float kp;
    float ki;
    float kd;
    float sample_time;

    float integral_term;
    float previous_measurement;
    float integral_limit;
    float output_min;
    float output_max;
    uint8_t conditional_integration;
} PID_Controller_t;

void PID_Controller_Init(PID_Controller_t *pid,
                         float kp,
                         float ki,
                         float kd,
                         float sample_time,
                         float output_min,
                         float output_max,
                         float integral_limit);

void PID_Controller_Reset(PID_Controller_t *pid, float measurement);
float PID_Controller_Update(PID_Controller_t *pid,
                            float target,
                            float measurement);

#endif
