#include "eye_led.h" #define EYE_LED_MODE_NUM 8 #define EYE_LED_STEP_NUM 37 /* eye_led_table[mode][step] = { duration_sec, freq_hz }, 从 eye_led.h 提取 */ static const eye_led_step_t eye_led_table[EYE_LED_MODE_NUM][EYE_LED_STEP_NUM] = { /* mode 1 */ {{3, 1}, {4, 5}, {3, 15}, {9, 31}, {19, 7}, {5, 19}, {21, 9}, {22, 10}, {23, 11}, {24, 12}, {25, 13}, {26, 14}, {27, 15}, {28, 16}, {29, 17}, {10, 4}, {90, 13}, {5, 6}, {45, 25}, {7, 9}, {25, 3}, {75, 8}, {5, 28}, {10, 11}, {90, 25}, {9, 5}, {3, 17}, {14, 4}, {120, 8}, {7, 31}, {14, 9}, {3, 12}, {45, 24}, {21, 5}, {75, 11}, {14, 3}, {5, 17}}, /* mode 2 */ {{5, 1}, {11, 5}, {3, 22}, {8, 26}, {17, 3}, {5, 24}, {21, 9}, {3, 22}, {5, 10}, {7, 25}, {9, 3}, {27, 19}, {75, 6}, {5, 16}, {75, 26}, {10, 6}, {90, 17}, {5, 4}, {45, 15}, {7, 9}, {25, 21}, {75, 6}, {5, 14}, {7, 3}, {3, 5}, {90, 26}, {9, 13}, {3, 22}, {14, 3}, {120, 7}, {7, 22}, {14, 8}, {3, 15}, {45, 4}, {75, 13}, {14, 25}, {5, 13}}, /* mode 3 */ {{6, 1}, {12, 5}, {29, 22}, {7, 13}, {21, 7}, {5, 17}, {21, 9}, {3, 25}, {5, 10}, {7, 25}, {9, 3}, {27, 25}, {75, 5}, {5, 15}, {75, 25}, {10, 13}, {90, 9}, {5, 31}, {45, 22}, {7, 11}, {25, 2}, {75, 23}, {5, 14}, {7, 5}, {3, 24}, {90, 10}, {9, 4}, {3, 19}, {14, 6}, {120, 11}, {7, 22}, {14, 5}, {3, 19}, {45, 25}, {21, 3}, {75, 9}, {14, 15}}, /* mode 4 */ {{8, 1}, {12, 5}, {3, 15}, {8, 31}, {19, 11}, {5, 31}, {21, 9}, {3, 16}, {5, 10}, {7, 25}, {9, 3}, {27, 25}, {75, 7}, {5, 17}, {75, 28}, {10, 16}, {90, 9}, {5, 3}, {45, 16}, {32, 7}, {75, 12}, {5, 7}, {7, 28}, {3, 13}, {90, 20}, {9, 11}, {3, 29}, {14, 14}, {120, 9}, {7, 3}, {14, 19}, {3, 7}, {45, 22}, {21, 5}, {75, 11}, {14, 31}, {5, 18}}, /* mode 5 */ {{3, 1}, {9, 5}, {3, 15}, {7, 29}, {15, 14}, {5, 9}, {21, 6}, {3, 6}, {5, 10}, {7, 25}, {9, 3}, {27, 29}, {75, 13}, {5, 24}, {75, 33}, {10, 19}, {90, 5}, {5, 19}, {45, 8}, {7, 2}, {25, 25}, {75, 16}, {5, 7}, {7, 22}, {3, 9}, {90, 16}, {9, 7}, {3, 22}, {14, 3}, {120, 10}, {7, 31}, {14, 15}, {3, 4}, {66, 26}, {75, 7}, {14, 19}, {5, 3}}, /* mode 6 */ {{8, 1}, {11, 5}, {3, 15}, {7, 9}, {15, 22}, {5, 4}, {21, 15}, {3, 29}, {5, 10}, {7, 25}, {9, 3}, {27, 15}, {75, 8}, {5, 18}, {75, 29}, {10, 4}, {90, 18}, {5, 5}, {45, 31}, {7, 11}, {25, 2}, {75, 29}, {5, 11}, {7, 29}, {3, 17}, {90, 4}, {9, 17}, {3, 50}, {14, 25}, {120, 13}, {7, 2}, {14, 19}, {3, 8}, {45, 16}, {21, 28}, {75, 7}, {14, 15}}, /* mode 7 */ {{8, 1}, {13, 5}, {3, 15}, {7, 22}, {15, 4}, {5, 28}, {21, 9}, {3, 22}, {5, 10}, {7, 25}, {9, 3}, {27, 16}, {75, 5}, {5, 15}, {75, 25}, {10, 9}, {90, 15}, {5, 3}, {45, 22}, {7, 15}, {25, 9}, {75, 4}, {5, 22}, {10, 5}, {90, 29}, {9, 3}, {3, 12}, {14, 22}, {120, 7}, {7, 3}, {14, 5}, {3, 11}, {45, 24}, {21, 7}, {75, 11}, {14, 22}, {5, 3}}, /* mode 8 */ {{3, 1}, {5, 3}, {5, 5}, {7, 3}, {8, 5}, {11, 7}, {13, 9}, {15, 11}, {17, 13}, {19, 15}, {21, 7}, {3, 22}, {5, 5}, {5, 22}, {7, 6}, {9, 20}, {21, 7}, {13, 22}, {3, 4}, {5, 12}, {5, 9}, {7, 22}, {9, 5}, {11, 22}, {13, 6}, {3, 15}, {21, 7}, {5, 14}, {39, 5}, {9, 22}, {33, 7}, {15, 20}, {12, 6}, {11, 9}, {10, 5}, {5, 3}, {5, 2}}, }; typedef struct _eye_led_var_ { int eye_led_timer; u8 eye_led_mode; /* 1~8 */ u8 step_idx; /* 当前步骤 0~36 */ u16 step_ticks; /* 当前步骤内 10ms 计数 */ u16 blink_ticks; /* 闪烁半周期 10ms 计数 */ u8 led_on; /* LED 当前亮灭 */ } _eye_led_var; static _eye_led_var eye_led_var; #define __this (&eye_led_var) static void (*eye_led_complete_cb)(void) = NULL; static void eye_led_timer_callback(void *priv) { u8 mode = __this->eye_led_mode; if (mode == 0 || mode > EYE_LED_MODE_NUM) return; const eye_led_step_t *st = &eye_led_table[mode - 1][__this->step_idx]; u8 duration = st->duration; u8 freq = st->freq; u16 half_period = (freq > 0) ? (50u / (u16)freq) : 50; if (half_period < 1) half_period = 1; __this->blink_ticks++; if (__this->blink_ticks >= half_period) { __this->blink_ticks = 0; __this->led_on = !__this->led_on; if (__this->led_on) EYE_LED_ON(); else EYE_LED_OFF(); } __this->step_ticks++; if (__this->step_ticks >= (u16)duration * 100u) { __this->step_idx++; __this->step_ticks = 0; __this->blink_ticks = 0; if (__this->step_idx >= EYE_LED_STEP_NUM) { if (eye_led_complete_cb) eye_led_complete_cb(); eye_led_stop(); return; } } } void eye_led_init(void) { __this->eye_led_timer = 0; __this->eye_led_mode = 0; __this->step_idx = 0; __this->step_ticks = 0; __this->blink_ticks = 0; __this->led_on = 1; } void eye_led_set_mode(u8 mode) { if (mode >= EYE_LED_MODE_NUM) { mode = EYE_LED_MODE_NUM; } __this->eye_led_mode = mode; } void eye_led_start(void) { if (__this->eye_led_timer != 0) { sys_timer_del(__this->eye_led_timer); __this->eye_led_timer = 0; } __this->step_idx = 0; __this->step_ticks = 0; __this->blink_ticks = 0; __this->led_on = 1; __this->eye_led_timer = sys_timer_add(NULL, eye_led_timer_callback, 10); /* 10ms */ EYE_LED_ON(); } void eye_led_stop(void) { if (__this->eye_led_timer != 0) { sys_timer_del(__this->eye_led_timer); __this->eye_led_timer = 0; } EYE_LED_OFF(); } u8 eye_led_get_mode(void) { return (__this->eye_led_timer != 0) ? __this->eye_led_mode : 0; } void eye_led_set_complete_callback(void (*cb)(void)) { eye_led_complete_cb = cb; }