level_duration.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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_RESERVED 0x800000U
  9. typedef struct {
  10. uint32_t level;
  11. uint32_t duration;
  12. } LevelDuration;
  13. static inline LevelDuration level_duration_make(bool level, uint32_t duration) {
  14. LevelDuration level_duration;
  15. level_duration.level = level ? LEVEL_DURATION_LEVEL_HIGH : LEVEL_DURATION_LEVEL_LOW;
  16. level_duration.duration = duration;
  17. return level_duration;
  18. }
  19. static inline LevelDuration level_duration_reset() {
  20. LevelDuration level_duration;
  21. level_duration.level = LEVEL_DURATION_RESET;
  22. return level_duration;
  23. }
  24. static inline bool level_duration_is_reset(LevelDuration level_duration) {
  25. return level_duration.level == LEVEL_DURATION_RESET;
  26. }
  27. static inline bool level_duration_get_level(LevelDuration level_duration) {
  28. return level_duration.level == LEVEL_DURATION_LEVEL_HIGH;
  29. }
  30. static inline uint32_t level_duration_get_duration(LevelDuration level_duration) {
  31. return level_duration.duration;
  32. }
  33. #else
  34. #define LEVEL_DURATION_RESET 0U
  35. #define LEVEL_DURATION_RESERVED 0x800000U
  36. typedef int32_t LevelDuration;
  37. static inline LevelDuration level_duration(bool level, uint32_t duration) {
  38. return level ? duration : -(int32_t)duration;
  39. }
  40. static inline LevelDuration level_duration_reset() {
  41. return LEVEL_DURATION_RESET;
  42. }
  43. static inline bool level_duration_is_reset(LevelDuration level_duration) {
  44. return (level_duration == LEVEL_DURATION_RESET);
  45. }
  46. static inline bool level_duration_get_level(LevelDuration level_duration) {
  47. return (level_duration > 0);
  48. }
  49. static inline uint32_t level_duration_get_duration(LevelDuration level_duration) {
  50. return (level_duration >= 0) ? level_duration : -level_duration;
  51. }
  52. #endif