#ifndef _LED_CONFIG_H
#define _LED_CONFIG_H/*============================================================================** 基础定义*============================================================================*//* LED颜色定义 */
#define COLOR_RED 0x01
#define COLOR_GREEN 0x02
#define COLOR_BLUE 0x04
#define COLOR_YELLOW (COLOR_RED | COLOR_GREEN)
#define COLOR_WHITE (COLOR_RED | COLOR_GREEN | COLOR_BLUE)/* 闪烁模式定义 */
#define BLINK_OFF 0 /* 常亮 */
#define BLINK_SLOW 1 /* 慢闪:1Hz */
#define BLINK_FAST 2 /* 快闪:5Hz */
#define BLINK_BREATH 3 /* 呼吸灯效果"/* 场景ID定义 */
#define SCENE_NORMAL 1
#define SCENE_WARNING 2
#define SCENE_ERROR 3
#define SCENE_STANDBY 4/*================ 1. 定义LED场景配置表 ================*/
#define LED_SCENE_TABLE \/* id, 颜色, 闪烁模式, 亮度, 描述 */ \X(SCENE_NORMAL, COLOR_GREEN, BLINK_OFF, 100, "系统正常") \X(SCENE_WARNING, COLOR_YELLOW, BLINK_SLOW, 80, "系统警告") \X(SCENE_ERROR, COLOR_RED, BLINK_FAST, 100, "系统错误") \X(SCENE_STANDBY, COLOR_BLUE, BLINK_BREATH, 30, "系统待机")/*================ 2. 当前场景选择 ================*/
#define CURRENT_SCENE_ID SCENE_NORMAL/*================ 3. X-Macro自动展开系统 ================*//* 第一步:清除可能存在的旧定义 */
#undef LED_COLOR
#undef LED_BLINK_MODE
#undef LED_BRIGHTNESS
#undef LED_DESCRIPTION/* 辅助宏:字符串连接 */
#define CONCAT(a, b) a##b
#define CONCAT3(a, b, c) a##b##c/* 第二步:使用X-Macro自动生成每个场景的配置宏 */
#define X(id, color, blink, brightness, desc) \#define CONCAT3(id, __, COLOR) color \#define CONCAT3(id, __, BLINK) blink \#define CONCAT3(id, __, BRIGHTNESS) brightness \#define CONCAT3(id, __, DESC) desc/* 展开配置表,生成所有场景的宏 */
LED_SCENE_TABLE
#undef X/* 第三步:根据当前场景选择配置 */
#define _SELECT_COLOR(id) CONCAT3(id, __, COLOR)
#define _SELECT_BLINK(id) CONCAT3(id, __, BLINK)
#define _SELECT_BRIGHTNESS(id) CONCAT3(id, __, BRIGHTNESS)
#define _SELECT_DESC(id) CONCAT3(id, __, DESC)/* 第四步:应用选中的配置 */
#define LED_COLOR _SELECT_COLOR(CURRENT_SCENE_ID)
#define LED_BLINK_MODE _SELECT_BLINK(CURRENT_SCENE_ID)
#define LED_BRIGHTNESS _SELECT_BRIGHTNESS(CURRENT_SCENE_ID)
#define LED_DESCRIPTION _SELECT_DESC(CURRENT_SCENE_ID)/*============================================================================** 函数式宏*============================================================================*//* 判断是否是某个颜色 */
#define IS_RED_LED() ((LED_COLOR & COLOR_RED) != 0)
#define IS_GREEN_LED() ((LED_COLOR & COLOR_GREEN) != 0)
#define IS_BLUE_LED() ((LED_COLOR & COLOR_BLUE) != 0)/* 判断闪烁模式 */
#define IS_BLINKING() (LED_BLINK_MODE != BLINK_OFF)
#define IS_BREATHING() (LED_BLINK_MODE == BLINK_BREATH)/* 亮度相关 */
#define IS_BRIGHT() (LED_BRIGHTNESS > 70)
#define IS_DIM() (LED_BRIGHTNESS < 40)/*============================================================================** 使用示例*============================================================================*/#ifdef __cplusplus
extern "C" {
#endif/* 根据配置控制LED的实际函数 */
void led_init(void);
void led_set_color(int color);
void led_set_blink(int mode);
void led_set_brightness(int percent);/* 初始化LED(使用配置) */
void init_led_from_config(void) {led_set_color(LED_COLOR);led_set_blink(LED_BLINK_MODE);led_set_brightness(LED_BRIGHTNESS);/* 使用函数式宏 */if (IS_BLINKING()) {/* 处理闪烁逻辑 */}if (IS_RED_LED() && IS_BRIGHT()) {/* 红色高亮时的特殊处理 */}
}#ifdef __cplusplus
}
#endif#endif /* _LED_CONFIG_H */
🔧 工作原理说明:
-
配置表是唯一数据源:所有场景配置只在
LED_SCENE_TABLE中定义一次 -
自动展开:通过X宏自动为每个场景生成对应的配置宏:
-
SCENE_NORMAL__COLOR -
SCENE_NORMAL__BLINK -
SCENE_NORMAL__BRIGHTNESS -
SCENE_NORMAL__DESC
-
-
动态选择:根据
CURRENT_SCENE_ID选择对应的宏 -
最终配置:生成
LED_COLOR、LED_BLINK_MODE等最终配置宏
📝 验证扩展性:
要添加新场景,只需要在配置表中加一行:
#define LED_SCENE_TABLE \/* id, 颜色, 闪烁模式, 亮度, 描述 */ \X(SCENE_NORMAL, COLOR_GREEN, BLINK_OFF, 100, "系统正常") \X(SCENE_WARNING, COLOR_YELLOW, BLINK_SLOW, 80, "系统警告") \X(SCENE_ERROR, COLOR_RED, BLINK_FAST, 100, "系统错误") \X(SCENE_STANDBY, COLOR_BLUE, BLINK_BREATH, 30, "系统待机") \X(SCENE_DEBUG, COLOR_WHITE, BLINK_FAST, 50, "调试模式") /* 新增 *//* 定义新场景ID */
#define SCENE_DEBUG 5/* 修改当前场景即可切换 */
#define CURRENT_SCENE_ID SCENE_DEBUG
这样,所有配置都会自动生成,无需手动定义其他宏。这才是真正的X-Macro自动展开!