encoder.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include <rtdevice.h>
  2. #include <encoder.h>
  3. #define DBG_SECTION_NAME "encoder"
  4. #define DBG_LEVEL DBG_LOG
  5. #include <rtdbg.h>
  6. encoder_t encoder_create(rt_size_t size)
  7. {
  8. // Malloc memory and initialize
  9. encoder_t new_encoder = (encoder_t)rt_malloc(size);
  10. if(new_encoder == RT_NULL)
  11. {
  12. LOG_E("Failed to malloc memory for new encoder\n");
  13. return RT_NULL;
  14. }
  15. new_encoder->pulse_count = 0;
  16. new_encoder->last_count = 0;
  17. return new_encoder;
  18. }
  19. rt_err_t encoder_destroy(encoder_t enc)
  20. {
  21. LOG_D("Free Encoder");
  22. RT_ASSERT(enc != RT_NULL);
  23. return enc->destroy(enc);
  24. }
  25. rt_err_t encoder_enable(encoder_t enc)
  26. {
  27. LOG_D("Enabling encoder");
  28. RT_ASSERT(enc != RT_NULL);
  29. return enc->enable(enc);
  30. }
  31. rt_err_t encoder_disable(encoder_t enc)
  32. {
  33. LOG_D("Diabling encoder");
  34. RT_ASSERT(enc != RT_NULL);
  35. return enc->disable(enc);
  36. }
  37. rt_int32_t encoder_read(encoder_t enc)
  38. {
  39. RT_ASSERT(enc != RT_NULL);
  40. return enc->pulse_count;
  41. }
  42. rt_err_t encoder_reset(encoder_t enc)
  43. {
  44. RT_ASSERT(enc != RT_NULL);
  45. enc->pulse_count = 0;
  46. return RT_EOK;
  47. }
  48. rt_int16_t encoder_measure_cps(encoder_t enc)
  49. {
  50. RT_ASSERT(enc != RT_NULL);
  51. // TODO
  52. // return count per second
  53. if((rt_tick_get() - enc->last_time) < rt_tick_from_millisecond(enc->sample_time))
  54. {
  55. LOG_D("Encoder waiting ... ");
  56. return enc->cps;
  57. }
  58. rt_int32_t diff_count = enc->pulse_count - enc->last_count;
  59. // if (diff_count >= INT32_MAX)
  60. // {
  61. // diff_count = -(enc->pulse_count + enc->last_count);
  62. // }
  63. // if (diff_count <= INT32_MIN)
  64. // {
  65. // diff_count = enc->pulse_count + enc->last_count;
  66. // }
  67. enc->cps = diff_count * 1000 / enc->sample_time;
  68. enc->last_count = enc->pulse_count;
  69. enc->last_time = rt_tick_get();
  70. return enc->cps;
  71. }
  72. rt_int16_t encoder_measure_rpm(encoder_t enc)
  73. {
  74. RT_ASSERT(enc != RT_NULL);
  75. // return resolution per minute
  76. rt_int16_t res_rpm = encoder_measure_cps(enc) * 60 / enc->pulse_revol;
  77. return res_rpm;
  78. }
  79. rt_err_t encoder_set_sample_time(encoder_t enc, rt_uint16_t sample_time)
  80. {
  81. RT_ASSERT(enc != RT_NULL);
  82. enc->sample_time = sample_time;
  83. return RT_EOK;
  84. }