KT25-1015_AC695x_SDK310/apps/kaotings/kt.c
2026-07-20 00:22:24 +08:00

323 lines
8.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "kt.h"
#include "key_event_deal.h"
#include "music_player.h"
enum {
KT_LED_IDLE = 0, /* 空闲慢闪 */
KT_LED_PLAY, /* 播放常亮 */
KT_LED_FAIL, /* 播放失败快闪 */
};
/* 定时器 50ms慢闪 1s灭/1s亮快闪 100ms灭/100ms亮 */
#define KT_LED_SLOW_HALF 20
#define KT_LED_FAST_HALF 2
typedef struct _kt_var_ {
int kt_timer;
int t_cnt;
u8 led_mode;
u8 active_ch; /* 1~6, 0=无按键播放会话 */
} _kt_var;
static _kt_var kt_var;
#define __this (&kt_var)
static const char *const kt_file_tab[6] = {
"/01.mp3", "/02.mp3", "/03.mp3", "/04.mp3", "/05.mp3", "/06.mp3",
};
static void kt_led_set_mode(u8 mode)
{
__this->led_mode = mode;
__this->t_cnt = 0;
if (mode == KT_LED_PLAY) {
BT_LED_ON();
}
}
static void kt_audio_all_off(void)
{
AUDIO_OUT_CH1_OFF();
AUDIO_OUT_CH2_OFF();
AUDIO_OUT_CH3_OFF();
AUDIO_OUT_CH4_OFF();
}
static void kt_channel_outputs_off(u8 ch)
{
switch (ch) {
case 1:
AUDIO_OUT_CH1_OFF();
VOLTAGE_OUT_CH1_OFF();
VLED_OUT_CH1_OFF();
break;
case 2:
AUDIO_OUT_CH2_OFF();
VOLTAGE_OUT_CH2_OFF();
VLED_OUT_CH2_OFF();
break;
case 3:
AUDIO_OUT_CH3_OFF();
VOLTAGE_OUT_CH3_OFF();
VLED_OUT_CH3_OFF();
break;
case 4:
AUDIO_OUT_CH4_OFF();
VOLTAGE_OUT_CH4_OFF();
VLED_OUT_CH4_OFF();
break;
case 5:
VLED_OUT_CH5_OFF();
break;
case 6:
VLED_OUT_CH6_OFF();
break;
default:
break;
}
}
static void kt_channel_outputs_on(u8 ch)
{
/* 音频通道互斥:先全关再开对应通道(仅 1~4 有音频/电压脚) */
kt_audio_all_off();
VOLTAGE_OUT_CH1_OFF();
VOLTAGE_OUT_CH2_OFF();
VOLTAGE_OUT_CH3_OFF();
VOLTAGE_OUT_CH4_OFF();
VLED_OUT_CH1_OFF();
VLED_OUT_CH2_OFF();
VLED_OUT_CH3_OFF();
VLED_OUT_CH4_OFF();
VLED_OUT_CH5_OFF();
VLED_OUT_CH6_OFF();
switch (ch) {
case 1:
AUDIO_OUT_CH1_ON();
VOLTAGE_OUT_CH1_ON();
VLED_OUT_CH1_ON();
break;
case 2:
AUDIO_OUT_CH2_ON();
VOLTAGE_OUT_CH2_ON();
VLED_OUT_CH2_ON();
break;
case 3:
AUDIO_OUT_CH3_ON();
VOLTAGE_OUT_CH3_ON();
VLED_OUT_CH3_ON();
break;
case 4:
AUDIO_OUT_CH4_ON();
VOLTAGE_OUT_CH4_ON();
VLED_OUT_CH4_ON();
break;
case 5:
/* 硬件无 AUDIO/VOLTAGE 通道5仅 VLED */
VLED_OUT_CH5_ON();
break;
case 6:
/* 硬件无 AUDIO/VOLTAGE 通道6仅 VLED */
VLED_OUT_CH6_ON();
break;
default:
break;
}
}
void kt_boot_init(void)
{
//CS8406 RST
gpio_set_pull_down(IO_PORTA_06,0);
gpio_set_pull_up(IO_PORTA_06,0);
gpio_set_direction(IO_PORTA_06,0);
gpio_set_output_value(IO_PORTA_06,0);
//iis 双绑引脚高阻化
gpio_set_pull_down(IO_PORTA_01,0);
gpio_set_pull_up(IO_PORTA_01,0);
gpio_set_direction(IO_PORTA_01,1);
gpio_set_die(IO_PORTA_01,1);
gpio_set_pull_down(IO_PORTA_05,0);
gpio_set_pull_up(IO_PORTA_05,0);
gpio_set_direction(IO_PORTA_05,1);
gpio_set_die(IO_PORTA_05,1);
//CS8406 TX EN
gpio_set_pull_down(AUDIO_OUT_CHANNEL1,0);
gpio_set_pull_up(AUDIO_OUT_CHANNEL1,0);
gpio_set_direction(AUDIO_OUT_CHANNEL1,0);
gpio_set_output_value(AUDIO_OUT_CHANNEL1,0);
gpio_set_pull_down(AUDIO_OUT_CHANNEL2,0);
gpio_set_pull_up(AUDIO_OUT_CHANNEL2,0);
gpio_set_direction(AUDIO_OUT_CHANNEL2,0);
gpio_set_output_value(AUDIO_OUT_CHANNEL2,0);
gpio_set_pull_down(AUDIO_OUT_CHANNEL3,0);
gpio_set_pull_up(AUDIO_OUT_CHANNEL3,0);
gpio_set_direction(AUDIO_OUT_CHANNEL3,0);
gpio_set_output_value(AUDIO_OUT_CHANNEL3,0);
gpio_set_pull_down(AUDIO_OUT_CHANNEL4,0);
gpio_set_pull_up(AUDIO_OUT_CHANNEL4,0);
gpio_set_direction(AUDIO_OUT_CHANNEL4,0);
gpio_set_output_value(AUDIO_OUT_CHANNEL4,0);
//voltage output
gpio_set_pull_down(VOLTAGE_OUT_CHANNEL1,0);
gpio_set_pull_up(VOLTAGE_OUT_CHANNEL1,0);
gpio_set_direction(VOLTAGE_OUT_CHANNEL1,0);
gpio_set_output_value(VOLTAGE_OUT_CHANNEL1,0);
gpio_set_pull_down(VOLTAGE_OUT_CHANNEL2,0);
gpio_set_pull_up(VOLTAGE_OUT_CHANNEL2,0);
gpio_set_direction(VOLTAGE_OUT_CHANNEL2,0);
gpio_set_output_value(VOLTAGE_OUT_CHANNEL2,0);
gpio_set_pull_down(VOLTAGE_OUT_CHANNEL3,0);
gpio_set_pull_up(VOLTAGE_OUT_CHANNEL3,0);
gpio_set_direction(VOLTAGE_OUT_CHANNEL3,0);
gpio_set_output_value(VOLTAGE_OUT_CHANNEL3,0);
gpio_set_pull_down(VOLTAGE_OUT_CHANNEL4,0);
gpio_set_pull_up(VOLTAGE_OUT_CHANNEL4,0);
gpio_set_direction(VOLTAGE_OUT_CHANNEL4,0);
gpio_set_output_value(VOLTAGE_OUT_CHANNEL4,0);
//vled output
gpio_set_pull_down(VLED_OUT_CHANNEL1,0);
gpio_set_pull_up(VLED_OUT_CHANNEL1,0);
gpio_set_direction(VLED_OUT_CHANNEL1,0);
gpio_set_output_value(VLED_OUT_CHANNEL1,0);
gpio_set_pull_down(VLED_OUT_CHANNEL2,0);
gpio_set_pull_up(VLED_OUT_CHANNEL2,0);
gpio_set_direction(VLED_OUT_CHANNEL2,0);
gpio_set_output_value(VLED_OUT_CHANNEL2,0);
gpio_set_pull_down(VLED_OUT_CHANNEL3,0);
gpio_set_pull_up(VLED_OUT_CHANNEL3,0);
gpio_set_direction(VLED_OUT_CHANNEL3,0);
gpio_set_output_value(VLED_OUT_CHANNEL3,0);
gpio_set_pull_down(VLED_OUT_CHANNEL4,0);
gpio_set_pull_up(VLED_OUT_CHANNEL4,0);
gpio_set_direction(VLED_OUT_CHANNEL4,0);
gpio_set_output_value(VLED_OUT_CHANNEL4,0);
gpio_set_pull_down(VLED_OUT_CHANNEL5,0);
gpio_set_pull_up(VLED_OUT_CHANNEL5,0);
gpio_set_direction(VLED_OUT_CHANNEL5,0);
gpio_set_output_value(VLED_OUT_CHANNEL5,0);
gpio_set_pull_down(VLED_OUT_CHANNEL6,0);
gpio_set_pull_up(VLED_OUT_CHANNEL6,0);
gpio_set_direction(VLED_OUT_CHANNEL6,0);
gpio_set_output_value(VLED_OUT_CHANNEL6,0);
//bt led
gpio_set_pull_down(BT_LED_PIN,0);
gpio_set_pull_up(BT_LED_PIN,0);
gpio_set_direction(BT_LED_PIN,0);
gpio_set_output_value(BT_LED_PIN,0);
}
static void timer_cb(void *priv)
{
u8 half;
if (__this->led_mode == KT_LED_PLAY) {
BT_LED_ON();
return;
}
half = (__this->led_mode == KT_LED_FAIL) ? KT_LED_FAST_HALF : KT_LED_SLOW_HALF;
__this->t_cnt++;
if (__this->t_cnt <= half) {
BT_LED_OFF();
} else if (__this->t_cnt <= (half * 2)) {
BT_LED_ON();
} else {
__this->t_cnt = 0;
}
}
static void start_time_base(u32 time_base_ms)
{
if (__this->kt_timer) {
sys_timer_del(__this->kt_timer);
}
__this->t_cnt = 0;
__this->kt_timer = sys_timer_add(NULL, timer_cb, time_base_ms);
}
void kt_init(void)
{
__this->active_ch = 0;
kt_led_set_mode(KT_LED_IDLE);
//CS8406 RST
gpio_set_output_value(IO_PORTA_06, 1);
/* 默认关闭各音频通道,按键播放时再打开对应通道 */
kt_audio_all_off();
start_time_base(50);
}
/* 播放结束/出错/拔卡关闭对应输出返回1表示是按键播放会话 */
int kt_music_play_end_handler(void)
{
if (__this->active_ch == 0) {
return 0;
}
printf("kt_music_play_end_handler ch=%d\n", __this->active_ch);
kt_channel_outputs_off(__this->active_ch);
__this->active_ch = 0;
kt_led_set_mode(KT_LED_IDLE);
return 1;
}
/*
* 优先 sd1/0x.mp3其次 udisk0/0x.mp3
* 成功则打开对应音频/电压/VLED失败不做任何反应
* 播完由 kt_music_play_end_handler 关闭输出。
*/
int kt_key_event_handler(u16 key)
{
u8 ch;
int err;
const char *path;
if (key < KEY_USER_KEY_1 || key > KEY_USER_KEY_6) {
return MUSIC_PLAYER_ERR_NULL;
}
ch = (u8)(key - KEY_USER_KEY_1 + 1);
path = kt_file_tab[ch - 1];
printf("kt_key_event_handler key=%d ch=%d path=%s\n", key, ch, path);
/* 若上一首按键播放未结束,先关掉上一通道输出 */
if (__this->active_ch) {
kt_channel_outputs_off(__this->active_ch);
__this->active_ch = 0;
}
err = music_player_play_by_path((char *)"sd1", path);
if (err != MUSIC_PLAYER_SUCC) {
err = music_player_play_by_path((char *)"udisk0", path);
}
if (err == MUSIC_PLAYER_SUCC) {
kt_channel_outputs_on(ch);
__this->active_ch = ch;
kt_led_set_mode(KT_LED_PLAY);
return MUSIC_PLAYER_SUCC;
}
/* 播放失败通道不动作BT_LED 快闪 */
printf("kt play fail ch=%d err=%d\n", ch, err);
kt_led_set_mode(KT_LED_FAIL);
return MUSIC_PLAYER_ERR_NULL;
}