156 lines
5.8 KiB
C
156 lines
5.8 KiB
C
|
|
#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;
|
||
|
|
}
|