KT25-1015_AC695x_SDK310/apps/kaotings/eye_led.c
2026-03-19 05:52:10 +08:00

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;
}