wled_enum.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. from enum import Enum
  2. from typing import Tuple
  3. from utils.logger_config import logger
  4. class RGBColor(Enum):
  5. """RGB颜色枚举类,包含常用颜色的RGB值"""
  6. # 基础颜色
  7. RED = (255, 0, 0)
  8. GREEN = (0, 255, 0)
  9. BLUE = (0, 0, 255)
  10. # 混合色
  11. YELLOW = (255, 255, 0)
  12. CYAN = (0, 255, 255)
  13. MAGENTA = (255, 0, 255)
  14. # 白色和黑色
  15. WHITE = (255, 255, 255)
  16. BLACK = (0, 0, 0)
  17. # 灰色系
  18. GRAY = (128, 128, 128)
  19. LIGHT_GRAY = (192, 192, 192)
  20. DARK_GRAY = (64, 64, 64)
  21. # 暖色调
  22. ORANGE = (255, 165, 0)
  23. PINK = (255, 192, 203)
  24. ROSE = (255, 0, 128)
  25. CORAL = (255, 127, 80)
  26. # 冷色调
  27. LIME = (0, 255, 0)
  28. AQUA = (0, 255, 255)
  29. NAVY = (0, 0, 128)
  30. TEAL = (0, 128, 128)
  31. # 紫色系
  32. PURPLE = (128, 0, 128)
  33. VIOLET = (238, 130, 238)
  34. INDIGO = (75, 0, 130)
  35. # 棕色系
  36. BROWN = (165, 42, 42)
  37. MAROON = (128, 0, 0)
  38. OLIVE = (128, 128, 0)
  39. # 特殊颜色
  40. GOLD = (255, 215, 0)
  41. SILVER = (192, 192, 192)
  42. COPPER = (184, 115, 51)
  43. def __init__(self, r: int, g: int, b: int):
  44. """初始化RGB颜色值"""
  45. self.r = r
  46. self.g = g
  47. self.b = b
  48. self._value_ = (r, g, b)
  49. @property
  50. def rgb_tuple(self) -> Tuple[int, int, int]:
  51. """返回RGB元组"""
  52. return (self.r, self.g, self.b)
  53. @property
  54. def hex_value(self) -> str:
  55. """返回十六进制颜色值"""
  56. return f"#{self.r:02x}{self.g:02x}{self.b:02x}".upper()
  57. def __str__(self) -> str:
  58. """字符串表示"""
  59. return f"{self.name}: RGB{self.rgb_tuple} ({self.hex_value})"
  60. @classmethod
  61. def from_hex(cls, hex_color: str) -> 'RGBColor':
  62. """从十六进制颜色值创建RGBColor实例"""
  63. hex_color = hex_color.lstrip('#')
  64. if len(hex_color) != 6:
  65. raise ValueError("十六进制颜色值必须是6位字符")
  66. r = int(hex_color[0:2], 16)
  67. g = int(hex_color[2:4], 16)
  68. b = int(hex_color[4:6], 16)
  69. # 查找最接近的预定义颜色
  70. closest_color = None
  71. min_distance = float('inf')
  72. for color in cls:
  73. distance = ((r - color.r) ** 2 + (g - color.g) ** 2 + (b - color.b) ** 2) ** 0.5
  74. if distance < min_distance:
  75. min_distance = distance
  76. closest_color = color
  77. return closest_color
  78. @classmethod
  79. def from_rgb(cls, r: int, g: int, b: int) -> 'RGBColor':
  80. """从RGB值创建RGBColor实例"""
  81. # 确保RGB值在有效范围内
  82. r = max(0, min(255, r))
  83. g = max(0, min(255, g))
  84. b = max(0, min(255, b))
  85. # 查找最接近的预定义颜色
  86. closest_color = None
  87. min_distance = float('inf')
  88. for color in cls:
  89. distance = ((r - color.r) ** 2 + (g - color.g) ** 2 + (b - color.b) ** 2) ** 0.5
  90. if distance < min_distance:
  91. min_distance = distance
  92. closest_color = color
  93. return closest_color
  94. class LEDEffectType(Enum):
  95. """LED效果类型枚举"""
  96. SOLID = 0
  97. BLINK = 1
  98. BREATH = 2
  99. COLOR_RANDOM_WAVE = 5
  100. COLOR_RANDOM_WINK = 7
  101. COLOR_RANDOM_BREATH = 8
  102. WINK = 12
  103. class LEDBrightness(Enum):
  104. """LED亮度等级枚举"""
  105. OFF = 0
  106. LOW = 25
  107. MEDIUM = 50
  108. HIGH = 75
  109. MAXIMUM = 255
  110. # 使用示例
  111. if __name__ == "__main__":
  112. # 基本使用
  113. logger.info("=== RGB颜色枚举使用示例 ===")
  114. # 获取颜色
  115. red = RGBColor.RED
  116. logger.info(f"红色: {red}")
  117. logger.info(f"RGB值: {red.rgb_tuple}")
  118. logger.info(f"十六进制: {red.hex_value}")
  119. # 从十六进制创建
  120. custom_color = RGBColor.from_hex("#FF5733")
  121. logger.info(f"从十六进制创建: {custom_color}")
  122. # 从RGB值创建
  123. custom_rgb = RGBColor.from_rgb(100, 200, 50)
  124. logger.info(f"从RGB创建: {custom_rgb}")
  125. # 遍历所有颜色
  126. logger.info("\n=== 所有预定义颜色 ===")
  127. for color in RGBColor:
  128. logger.info(f"{color.name:12} - {color}")