#ifndef _LINE_RAMP_H__
#define _LINE_RAMP_H__

typedef struct {
	float target;
	float interpolation;
	float step;
	float time;
	float time_dec;
	float min_step;
}lineramp_t;

static __INLINE void line_ramp_set_target(lineramp_t *line, float target) {
	if (line->target != target) {
		line->target = target;
		float delta = (line->target - line->interpolation);
		if (delta >= 0) {
			line->step = delta / line->time;
		}else {
			line->step = -delta / line->time_dec;
		}
		if ((line->min_step > 0) && (line->step < line->min_step)) {
			line->step = line->min_step;
		}
	}
}

static __INLINE void line_ramp_init(lineramp_t *line, float time) {
	line->target = 0;
	line->interpolation = 0;
	line->step = 0;
	line->min_step = 0;
	line->time_dec = line->time = time;
}

static __INLINE void line_ramp_reset(lineramp_t *line, float target) {
	line->target = target;
	line->interpolation = target;
}


static __INLINE void line_ramp_set_time(lineramp_t *line, float time) {
	line->time_dec = line->time = time;
}

static __INLINE void line_ramp_set_dectime(lineramp_t *line, float time) {
	line->time_dec = time;
}

static __INLINE void line_ramp_set_acctime(lineramp_t *line, float time) {
	line->time = time;
}

static __INLINE void line_ramp_set_minstep(lineramp_t *line, float step) {
	line->min_step = step;
}

static __INLINE float line_ramp_get_target(lineramp_t *line) {
	return line->target;
}

static __INLINE float line_ramp_get_interp(lineramp_t *line) {
	return line->interpolation;
}

static __INLINE void line_ramp_update(lineramp_t *line) {
	float delta = (line->target - line->interpolation);
	if (delta >= 0) {
		line->step = delta / line->time;
	}else {
		line->step = -delta / line->time_dec;
	}
}

static __INLINE float line_ramp_step(lineramp_t *line) {
	step_towards(&line->interpolation, line->target, line->step);
	return line->interpolation;
}


#endif /* _LINE_RAMP_H__ */

