ramp_ctrl.c 1.3 KB

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