ramp_ctrl.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include "ramp_ctrl.h"
  2. #define RAMP_INTVAL 1 //ms
  3. void ramp_timer_handler(timer_t *timer);
  4. void ramp_ctrl_init(ramp_t *ramp, float start, float final, u32 duration_ms){
  5. timer_cancel(&ramp->timer);
  6. ramp->start_point = start;
  7. ramp->target = start;
  8. ramp->final_point = final;
  9. ramp->duration_ms = duration_ms;
  10. ramp->steps = (final - start) / (duration_ms / RAMP_INTVAL);
  11. ramp->timer.handler = ramp_timer_handler;
  12. }
  13. void ramp_clear(ramp_t *ramp) {
  14. ramp_ctrl_init(ramp, ramp->start_point, ramp->final_point, ramp->duration_ms);
  15. }
  16. void ramp_exc(ramp_t *ramp){
  17. timer_post(&ramp->timer, RAMP_INTVAL);
  18. }
  19. float ramp_get_target(ramp_t *ramp){
  20. return ramp->target;
  21. }
  22. bool ramp_complete(ramp_t *ramp) {
  23. return ramp->target == ramp->final_point;
  24. }
  25. void ramp_timer_handler(timer_t *timer) {
  26. ramp_t *ramp = (ramp_t *)timer;
  27. float target = ramp->target + ramp->steps;
  28. if (target > ramp->final_point) {
  29. target = ramp->final_point;
  30. }
  31. ramp->target = target;
  32. if (target != ramp->final_point) {
  33. timer_post(&ramp->timer, RAMP_INTVAL);
  34. }else {
  35. timer_cancel(&ramp->timer);
  36. }
  37. }