level_duration.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma once
  2. #include <stdint.h>
  3. #define LEVEL_DURATION_BIG
  4. #ifdef LEVEL_DURATION_BIG
  5. #define LEVEL_DURATION_RESET 0U
  6. #define LEVEL_DURATION_LEVEL_LOW 1U
  7. #define LEVEL_DURATION_LEVEL_HIGH 2U
  8. #define LEVEL_DURATION_WAIT 3U
  9. #define LEVEL_DURATION_RESERVED 0x800000U
  10. typedef struct {
  11. uint32_t level;
  12. uint32_t duration;
  13. } LevelDuration;
  14. static inline LevelDuration level_duration_make(bool level, uint32_t duration) {
  15. LevelDuration level_duration;
  16. level_duration.level = level ? LEVEL_DURATION_LEVEL_HIGH : LEVEL_DURATION_LEVEL_LOW;
  17. level_duration.duration = duration;
  18. return level_duration;
  19. }
  20. static inline LevelDuration level_duration_reset() {
  21. LevelDuration level_duration;
  22. level_duration.level = LEVEL_DURATION_RESET;
  23. return level_duration;
  24. }
  25. static inline LevelDuration level_duration_wait() {
  26. LevelDuration level_duration;
  27. level_duration.level = LEVEL_DURATION_WAIT;
  28. return level_duration;
  29. }
  30. static inline bool level_duration_is_reset(LevelDuration level_duration) {
  31. return level_duration.level == LEVEL_DURATION_RESET;
  32. }
  33. static inline bool level_duration_is_wait(LevelDuration level_duration) {
  34. return level_duration.level == LEVEL_DURATION_WAIT;
  35. }
  36. static inline bool level_duration_get_level(LevelDuration level_duration) {
  37. return level_duration.level == LEVEL_DURATION_LEVEL_HIGH;
  38. }
  39. static inline uint32_t level_duration_get_duration(LevelDuration level_duration) {
  40. return level_duration.duration;
  41. }
  42. #else
  43. #define LEVEL_DURATION_RESET 0U
  44. #define LEVEL_DURATION_RESERVED 0x800000U
  45. typedef int32_t LevelDuration;
  46. static inline LevelDuration level_duration(bool level, uint32_t duration) {
  47. return level ? duration : -(int32_t)duration;
  48. }
  49. static inline LevelDuration level_duration_reset() {
  50. return LEVEL_DURATION_RESET;
  51. }
  52. static inline bool level_duration_is_reset(LevelDuration level_duration) {
  53. return (level_duration == LEVEL_DURATION_RESET);
  54. }
  55. static inline bool level_duration_get_level(LevelDuration level_duration) {
  56. return (level_duration > 0);
  57. }
  58. static inline uint32_t level_duration_get_duration(LevelDuration level_duration) {
  59. return (level_duration >= 0) ? level_duration : -level_duration;
  60. }
  61. #endif