#ifndef _ADRC_H__
#define _ADRC_H__

#include "math/fast_math.h"
#include "bsp/bsp_driver.h"

typedef struct {
	//扩张状态观测器
	float b0;
	float z1,z2;
	float p1,p2;
	float last_z1, last_z2;
	float ts;
	//线性状态误差反馈控制器
	float wcv;
	float out_min;
	float out_max;
	float out;
}ladrc_t;

void ladrc_init(ladrc_t *adrc, float ts, float wo, float wc, float b0);
float ladrc_run(ladrc_t *adrc, float in, float feedback);
void ladrc_reset(ladrc_t* adrc, float feedback, float out_init);
void ladrc_copy(ladrc_t *dst, ladrc_t *src);

static void __INLINE ladrc_set_range(ladrc_t *adrc, float min, float max) {
	adrc->out_min = min;
	adrc->out_max = max;
}
#endif /* _ADRC_H__ */

