ramp_ctrl.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "ramp_ctrl.h"
  2. #define RAMP_INTVAL 50 //ms
  3. void ramp_timer_handler(shark_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. shark_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. shark_timer_cancel(&ramp->timer);
  18. ramp->start_point = start;
  19. ramp->final_point = final;
  20. ramp->duration_ms = duration_ms;
  21. if (duration_ms == 0) {
  22. ramp->steps = (final - ramp->start_point);
  23. ramp->target = final;
  24. }else {
  25. ramp->steps = (final - ramp->start_point) / (duration_ms / RAMP_INTVAL);
  26. ramp_exc(ramp);
  27. }
  28. }
  29. void ramp_exc(ramp_t *ramp){
  30. shark_timer_post(&ramp->timer, RAMP_INTVAL);
  31. }
  32. float ramp_get_target(ramp_t *ramp){
  33. return ramp->target;
  34. }
  35. bool ramp_complete(ramp_t *ramp) {
  36. return ramp->target == ramp->final_point;
  37. }
  38. void ramp_timer_handler(shark_timer_t *timer) {
  39. ramp_t *ramp = (ramp_t *)timer;
  40. float target = ramp->target + ramp->steps;
  41. if (ramp->steps < 0) {
  42. if (target < ramp->final_point) {
  43. target = ramp->final_point;
  44. }
  45. }else {
  46. if (target > ramp->final_point) {
  47. target = ramp->final_point;
  48. }
  49. }
  50. ramp->target = target;
  51. if (target != ramp->final_point) {
  52. shark_timer_post(&ramp->timer, RAMP_INTVAL);
  53. }else {
  54. shark_timer_cancel(&ramp->timer);
  55. }
  56. }