Compare commits

..

2 Commits

Author SHA1 Message Date
ee3d08df89 生成固件 2026-03-19 15:02:49 +08:00
7fbb203e30 完成UI以及所有功能 2026-03-19 05:52:10 +08:00
41 changed files with 81328 additions and 87835 deletions

View File

@ -2,6 +2,7 @@
"files.associations": {
"drv_st7789.h": "c",
"kt_ui.h": "c",
"kt.h": "c"
"kt.h": "c",
"app_config.h": "c"
}
}

View File

@ -390,9 +390,9 @@ c_SRC_FILES := \
apps/ui/img_bg.c \
apps/ui/ico_bt.c \
apps/ui/ico_music.c \
apps/ui/ui_home.c \
apps/ui/ui_bt.c \
apps/ui/ui_music.c \
apps/kaotings/eye_led.c \
apps/soundbox/board/br23/board_ac6083a/board_ac6083a.c \
apps/soundbox/board/br23/board_ac6083a/key_table/adkey_table.c \
apps/soundbox/board/br23/board_ac6083a/key_table/iokey_table.c \

View File

@ -79,6 +79,17 @@ int __dev_manager_add(char *logo, u8 need_mount)
list_add_tail(&dev->entry, &__this->list);
os_mutex_post(&__this->mutex);
printf("%s, %s add ok, dev->fmnt = %x, %d\n", __FUNCTION__, logo, (int)dev->fmnt, dev->active_stamp);
//如果是sd1,则需要重新初始化一次lcd的spi
extern void lcd_spi_reinit(void);
if(!strcmp(logo, "sd1"))
{
printf("sd1, reinit lcd spi\n");
lcd_spi_reinit();
}
if(dev->fmnt == NULL){
return DEV_MANAGER_ADD_ERR_MOUNT_FAIL;
}

View File

@ -165,6 +165,13 @@ int music_player_end_deal(int parm)
} else {
///正常结束,自动下一曲
#if defined(TCFG_MUSIC_SINGLE_PLAY_NO_LOOP) && (TCFG_MUSIC_SINGLE_PLAY_NO_LOOP)
/* 单曲播放:播完不循环,不自动下一曲 */
if (app_var.cycle_mode == FCYCLE_ONE) {
err = MUSIC_PLAYER_ERR_NULL; /* 停止,不播下一曲 */
break;
}
#endif
#if (MUSIC_PLAYER_CYCLE_ALL_DEV_EN)
u32 cur_file = music_player_get_file_cur();
if ((music_player_get_record_play_status() == false)
@ -184,6 +191,12 @@ int music_player_end_deal(int parm)
///解码器产生的错误, 文件损坏等
case AUDIO_DEC_EVENT_ERR:
log_i("AUDIO_DEC_EVENT_ERR\n");
#if defined(TCFG_MUSIC_SINGLE_PLAY_NO_LOOP) && (TCFG_MUSIC_SINGLE_PLAY_NO_LOOP)
if (app_var.cycle_mode == FCYCLE_ONE) {
err = MUSIC_PLAYER_ERR_NULL; /* 单曲播放:出错也不自动下一曲 */
break;
}
#endif
err = music_player_play_auto_next();///文件播放过程出现的错误, 自动下一曲
break;
default:

View File

@ -249,17 +249,11 @@ void lcd_fill(u16 xsta, u16 ysta, u16 xend, u16 yend, u16 color)
void lcd_write_data_dma(u32 len, u8 *color)
{
// printf("lcd_write_data_dma %d \n", len);
// int spi_dma_send(spi_dev spi, const void *buf, u32 len);
// spi_send_byte(spi1_hdl, buf[i]);
DC_H();
// rt_pin_write((rt_base_t)st7789_device.config.user_data, PIN_HIGH);
// return rt_lcd_write_data(st7789_device.mcu, &data, 1);
CS_L();
DC_H();
// spi_send_byte(spi1_hdl,data);
// lcd_write(&data, 1);
spi_dma_send(LCD_SPI_CFG, color, len * 2);
u32 byte_len = len * 2;
spi_dma_send(LCD_SPI_CFG, color, byte_len);
CS_H();
}
@ -332,3 +326,11 @@ void lcd_st7789_init(void)
}
void lcd_spi_reinit(void)
{
spi_close(LCD_SPI_CFG);
spi_open(LCD_SPI_CFG);
//st7789_init_cmd();
}

156
apps/kaotings/eye_led.c Normal file
View File

@ -0,0 +1,156 @@
#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;
}

357
apps/kaotings/eye_led.h Normal file
View File

@ -0,0 +1,357 @@
#ifndef __EYE_LED_H__
#define __EYE_LED_H__
#include "kt.h"
//eye led
#define CFG_EYE_LED_PIN IO_PORTC_07 //同PA0双绑
#define EYE_LED_ON() (gpio_set_output_value(CFG_EYE_LED_PIN, 1))
#define EYE_LED_OFF() (gpio_set_output_value(CFG_EYE_LED_PIN, 0))
/* eye_led_table[mode][step] = { duration_sec, freq_hz } */
typedef struct {
u8 duration; /* 秒3~120 */
u8 freq; /* Hz1~50 */
} eye_led_step_t;
void eye_led_init(void);
void eye_led_set_mode(u8 mode);
void eye_led_start(void);
void eye_led_stop(void);
u8 eye_led_get_mode(void); /* 0=已停止1~8=当前运行模式 */
void eye_led_set_complete_callback(void (*cb)(void)); /* 37 步完成时回调 */
/**
* mode 1
*/
// 时长(秒) - 频率(HZ)
// 1 3S - 1HZ
// 2 4S - 5HZ
// 3 3S - 15HZ
// 4 9S - 31HZ
// 5 19S - 7HZ
// 6 5S - 19HZ
// 7 21S - 9HZ
// 8 22S - 10HZ
// 9 23S - 11HZ
// 10 24S - 12HZ
// 11 25S - 13HZ
// 12 26S - 14HZ
// 13 27S - 15HZ
// 14 28S - 16HZ
// 15 29S - 17HZ
// 16 10S - 4HZ
// 17 90S - 13HZ
// 18 5S - 6HZ
// 19 45S - 25HZ
// 20 7S - 9HZ
// 21 25S - 3HZ
// 22 75S - 8HZ
// 23 5S - 28HZ
// 24 10S - 11HZ
// 25 90S - 25HZ
// 26 9S - 5HZ
// 27 3S - 17HZ
// 28 14S - 4HZ
// 29 120S - 8HZ
// 30 7S - 31HZ
// 31 14S - 9HZ
// 32 3S - 12HZ
// 33 45S - 24HZ
// 34 21S - 5HZ
// 35 75S - 11HZ
// 36 14S - 3HZ
// 37 5S - 17HZ
/**
* mode 2
*/
// 时长(秒) - 频率(HZ)
// 1 5S - 1HZ
// 2 11S - 5HZ
// 3 3S - 22HZ
// 4 8S - 26HZ
// 5 17S - 3HZ
// 6 5S - 24HZ
// 7 21S - 9HZ
// 8 3S - 22HZ
// 9 5S - 10HZ
// 10 7S - 25HZ
// 11 9S - 3HZ
// 12 27S - 19HZ
// 13 75S - 6HZ
// 14 5S - 16HZ
// 15 75S - 26HZ
// 16 10S - 6HZ
// 17 90S - 17HZ
// 18 5S - 4HZ
// 19 45S - 15HZ
// 20 7S - 9HZ
// 21 25S - 21HZ
// 22 75S - 6HZ
// 23 5S - 14HZ
// 24 7S - 3HZ
// 25 3S - 5HZ
// 26 90S - 26HZ
// 27 9S - 13HZ
// 28 3S - 22HZ
// 29 14S - 3HZ
// 30 120S - 7HZ
// 31 7S - 22HZ
// 32 14S - 8HZ
// 33 3S - 15HZ
// 34 45S - 4HZ
// 35 75S - 13HZ
// 36 14S - 25HZ
// 37 5S - 13HZ
/**
* mode 3
*/
// 时长(秒) - 频率(HZ)
// 1 6S - 1HZ
// 2 12S - 5HZ
// 3 29S - 22HZ
// 4 7S - 13HZ
// 5 21S - 7HZ
// 6 5S - 17HZ
// 7 21S - 9HZ
// 8 3S - 25HZ
// 9 5S - 10HZ
// 10 7S - 25HZ
// 11 9S - 3HZ
// 12 27S - 25HZ
// 13 75S - 5HZ
// 14 5S - 15HZ
// 15 75S - 25HZ
// 16 10S - 13HZ
// 17 90S - 9HZ
// 18 5S - 31HZ
// 19 45S - 22HZ
// 20 7S - 11HZ
// 21 25S - 2HZ
// 22 75S - 23HZ
// 23 5S - 14HZ
// 24 7S - 5HZ
// 25 3S - 24HZ
// 26 90S - 10HZ
// 27 9S - 4HZ
// 28 3S - 19HZ
// 29 14S - 6HZ
// 30 120S - 11HZ
// 31 7S - 22HZ
// 32 14S - 5HZ
// 33 3S - 19HZ
// 34 45S - 25HZ
// 35 21S - 3HZ
// 36 75S - 9HZ
// 37 14S - 15HZ
/**
* mode 4
*/
// 时长(秒) - 频率(HZ)
// 1 8S - 1HZ
// 2 12S - 5HZ
// 3 3S - 15HZ
// 4 8S - 31HZ
// 5 19S - 11HZ
// 6 5S - 31HZ
// 7 21S - 9HZ
// 8 3S - 16HZ
// 9 5S - 10HZ
// 10 7S - 25HZ
// 11 9S - 3HZ
// 12 27S - 25HZ
// 13 75S - 7HZ
// 14 5S - 17HZ
// 15 75S - 28HZ
// 16 10S - 16HZ
// 17 90S - 9HZ
// 18 5S - 3HZ
// 19 45S - 16HZ
// 20 32S - 7HZ
// 21 75S - 12HZ
// 22 5S - 7HZ
// 23 7S - 28HZ
// 24 3S - 13HZ
// 25 90S - 20HZ
// 26 9S - 11HZ
// 27 3S - 29HZ
// 28 14S - 14HZ
// 29 120S - 9HZ
// 30 7S - 3HZ
// 31 14S - 19HZ
// 32 3S - 7HZ
// 33 45S - 22HZ
// 34 21S - 5HZ
// 35 75S - 11HZ
// 36 14S - 31HZ
// 37 5S - 18HZ
/**
* mode 5
*/
// 时长(秒) - 频率(HZ)
// 1 3S - 1HZ
// 2 9S - 5HZ
// 3 3S - 15HZ
// 4 7S - 29HZ
// 5 15S - 14HZ
// 6 5S - 9HZ
// 7 21S - 6HZ
// 8 3S - 6HZ
// 9 5S - 10HZ
// 10 7S - 25HZ
// 11 9S - 3HZ
// 12 27S - 29HZ
// 13 75S - 13HZ
// 14 5S - 24HZ
// 15 75S - 33HZ
// 16 10S - 19HZ
// 17 90S - 5HZ
// 18 5S - 19HZ
// 19 45S - 8HZ
// 20 7S - 2HZ
// 21 25S - 25HZ
// 22 75S - 16HZ
// 23 5S - 7HZ
// 24 7S - 22HZ
// 25 3S - 9HZ
// 26 90S - 16HZ
// 27 9S - 7HZ
// 28 3S - 22HZ
// 29 14S - 3HZ
// 30 120S - 10HZ
// 31 7S - 31HZ
// 32 14S - 15HZ
// 33 3S - 4HZ
// 34 66S - 26HZ
// 35 75S - 7HZ
// 36 14S - 19HZ
// 37 5S - 3HZ
/**
* mode 6
*/
// 时长(秒) - 频率(HZ)
// 1 8S - 1HZ
// 2 11S - 5HZ
// 3 3S - 15HZ
// 4 7S - 9HZ
// 5 15S - 22HZ
// 6 5S - 4HZ
// 7 21S - 15HZ
// 8 3S - 29HZ
// 9 5S - 10HZ
// 10 7S - 25HZ
// 11 9S - 3HZ
// 12 27S - 15HZ
// 13 75S - 8HZ
// 14 5S - 18HZ
// 15 75S - 29HZ
// 16 10S - 4HZ
// 17 90S - 18HZ
// 18 5S - 5HZ
// 19 45S - 31HZ
// 20 7S - 11HZ
// 21 25S - 2HZ
// 22 75S - 29HZ
// 23 5S - 11HZ
// 24 7S - 29HZ
// 25 3S - 17HZ
// 26 90S - 4HZ
// 27 9S - 17HZ
// 28 3S - 50HZ
// 29 14S - 25HZ
// 30 120S - 13HZ
// 31 7S - 2HZ
// 32 14S - 19HZ
// 33 3S - 8HZ
// 34 45S - 16HZ
// 35 21S - 28HZ
// 36 75S - 7HZ
// 37 14S - 15HZ
/**
* mode 7
*/
// 时长(秒) - 频率(HZ)
// 1 8S - 1HZ
// 2 13S - 5HZ
// 3 3S - 15HZ
// 4 7S - 22HZ
// 5 15S - 4HZ
// 6 5S - 28HZ
// 7 21S - 9HZ
// 8 3S - 22HZ
// 9 5S - 10HZ
// 10 7S - 25HZ
// 11 9S - 3HZ
// 12 27S - 16HZ
// 13 75S - 5HZ
// 14 5S - 15HZ
// 15 75S - 25HZ
// 16 10S - 9HZ
// 17 90S - 15HZ
// 18 5S - 3HZ
// 19 45S - 22HZ
// 20 7S - 15HZ
// 21 25S - 9HZ
// 22 75S - 4HZ
// 23 5S - 22HZ
// 24 10S - 5HZ
// 25 90S - 29HZ
// 26 9S - 3HZ
// 27 3S - 12HZ
// 28 14S - 22HZ
// 29 120S - 7HZ
// 30 7S - 3HZ
// 31 14S - 5HZ
// 32 3S - 11HZ
// 33 45S - 24HZ
// 34 21S - 7HZ
// 35 75S - 11HZ
// 36 14S - 22HZ
// 37 5S - 3HZ
/**
* mode 8
*/
// 时长(秒) - 频率(HZ)
// 1 3S - 1HZ
// 2 5S - 3HZ
// 3 5S - 5HZ
// 4 7S - 3HZ
// 5 8S - 5HZ
// 6 11S - 7HZ
// 7 13S - 9HZ
// 8 15S - 11HZ
// 9 17S - 13HZ
// 10 19S - 15HZ
// 11 21S - 7HZ
// 12 3S - 22HZ
// 13 5S - 5HZ
// 14 5S - 22HZ
// 15 7S - 6HZ
// 16 9S - 20HZ
// 17 21S - 7HZ
// 18 13S - 22HZ
// 19 3S - 4HZ
// 20 5S - 12HZ
// 21 5S - 9HZ
// 22 7S - 22HZ
// 23 9S - 5HZ
// 24 11S - 22HZ
// 25 13S - 6HZ
// 26 3S - 15HZ
// 27 21S - 7HZ
// 28 5S - 14HZ
// 29 39S - 5HZ
// 30 9S - 22HZ
// 31 33S - 7HZ
// 32 15S - 20HZ
// 33 12S - 6HZ
// 34 11S - 9HZ
// 35 10S - 5HZ
// 36 5S - 3HZ
// 37 5S - 2HZ
#endif

View File

@ -4,6 +4,8 @@
#include "key_event_deal.h"
#include "app_task.h"
#include "avctp_user.h"
#include "eye_led.h"
#include "user_cfg_id.h"
u16 tid = 0;
@ -26,10 +28,10 @@ void kt_boot_init(void)
gpio_set_die(IO_PORTA_00, 1);
gpio_set_direction(IO_PORTA_00, 1);
gpio_set_pull_up(CFG_FLASH_LED_PIN, 0);
gpio_set_pull_down(CFG_FLASH_LED_PIN, 0);
gpio_set_direction(CFG_FLASH_LED_PIN, 0);
FLASH_LED_OFF();
gpio_set_pull_up(CFG_EYE_LED_PIN, 0);
gpio_set_pull_down(CFG_EYE_LED_PIN, 0);
gpio_set_direction(CFG_EYE_LED_PIN, 0);
EYE_LED_OFF();
// bt led PA3
gpio_set_pull_up(CFG_BT_LED_PIN, 0);
@ -46,16 +48,18 @@ void kt_boot_init(void)
static void tid_timer_callback(void *priv)
{
// kt_ui_post_key_event(KEY_USER_PLAY_TIME_UPDATE, 0);
//printf("tid_timer_callback\n");
if (app_get_curr_task() == APP_BT_TASK)
{
if (get_bt_connect_status() == BT_STATUS_PLAYING_MUSIC)
{
//printf("tid_timer_callback: get_bt_connect_status() == BT_STATUS_PLAYING_MUSIC\n");
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_GET_PLAY_TIME, 0, NULL);
}
}
else if (app_get_curr_task() == APP_MUSIC_TASK)
{
/* Music 模式:定时刷新播放进度 */
kt_ui_post_key_event(KEY_USER_PLAY_TIME_UPDATE, 0);
}
}
static void start_timer(void)
{
@ -67,9 +71,83 @@ static void start_timer(void)
tid = sys_timer_add(NULL, tid_timer_callback, 200);
}
static void eye_led_complete_cb(void)
{
kt_ui_post_key_event(KEY_USER_EYE_LED_STOP, 0);
}
void kt_set_ex_led_color(u8 color)
{
switch (color)
{
case 0:
R_LED_OFF();
G_LED_OFF();
B_LED_OFF();
break;
case 1:
R_LED_ON();
G_LED_OFF();
B_LED_OFF();
break;
case 2:
R_LED_OFF();
G_LED_ON();
B_LED_OFF();
break;
case 3:
R_LED_OFF();
G_LED_OFF();
B_LED_ON();
break;
case 4:
R_LED_ON();
G_LED_ON();
B_LED_OFF();
break;
case 5:
R_LED_ON();
G_LED_OFF();
B_LED_ON();
break;
case 6:
R_LED_OFF();
G_LED_ON();
B_LED_ON();
break;
case 7:
R_LED_ON();
G_LED_ON();
B_LED_ON();
break;
default:
break;
}
syscfg_write(CFG_EX_LED_COLOR, &color, 1);
}
void ex_led_init(void)
{
R_LED_OFF();
G_LED_OFF();
B_LED_OFF();
u8 color = 0;
int ret = syscfg_read(CFG_EX_LED_COLOR, &color, 1);
if (ret != 1)
{
color = 0;
}
kt_set_ex_led_color(color);
}
void kt_init(void)
{
lcd_st7789_init();
eye_led_init();
eye_led_set_complete_callback(eye_led_complete_cb);
kt_ui_init();
start_timer();
@ -80,10 +158,48 @@ u8 kt_key_event_filter_after(int key_event, int key_value)
u8 ret = false;
switch (key_event)
{
case KEY_MUSIC_PREV:
case KEY_USER_LED:
//kt_set_ex_led_color(key_value);
{
u8 color = 0;
int ret = syscfg_read(CFG_EX_LED_COLOR, &color, 1);
if (ret != 1)
{
color = 0;
}
color++;
if (color > 7)
{
color = 0;
}
kt_set_ex_led_color(color);
}
ret = true;
break;
case KEY_USER_SETTING:
if (app_get_curr_task() == APP_MUSIC_TASK)
{
kt_ui_post_key_event(key_event, key_value);
ret = true;
}
break;
case KEY_MUSIC_NEXT:
case KEY_MUSIC_PREV:
/* 仅在 Music 页设置模式下转发,用于列表焦点移动 */
if (app_get_curr_task() == APP_MUSIC_TASK && kt_ui_music_setting_mode())
{
kt_ui_post_key_event(key_event, key_value);
ret = true;
}
break;
case KEY_MUSIC_PP: /* 设置模式下 PP 单击 = 确认 */
if (app_get_curr_task() == APP_MUSIC_TASK && kt_ui_music_setting_mode())
{
kt_ui_post_key_event(key_event, key_value);
ret = true;
}
break;
case KEY_USER_PLAY_TIME_UPDATE:
/* 投递到 UI 任务,由当前页面处理 (如 Home 页用于切换 BT/Music) */
kt_ui_post_key_event(key_event, key_value);
ret = true;
break;

View File

@ -10,19 +10,16 @@
#define KT_TASK_CMD_UPDATE_PLAY_TIME 4 /* 更新播放时间, msg[2]=play_time */
/* 页面 ID */
#define KT_PAGE_HOME 0
//#define KT_PAGE_HOME 0
#define KT_PAGE_BT 1
#define KT_PAGE_MUSIC 2
//mute
#define CFG_MUTE_PIN IO_PORTA_02 //同PA1双绑
#define PA_MUTE() (gpio_set_output_value(CFG_MUTE_PIN, 0))
#define PA_UNMUTE() (gpio_set_output_value(CFG_MUTE_PIN, 1))
#define PA_MUTE() (gpio_set_output_value(CFG_MUTE_PIN, 1))
#define PA_UNMUTE() (gpio_set_output_value(CFG_MUTE_PIN, 0))
//flash led
#define CFG_FLASH_LED_PIN IO_PORTC_07 //同PA0双绑
#define FLASH_LED_ON() (gpio_set_output_value(CFG_FLASH_LED_PIN, 1))
#define FLASH_LED_OFF() (gpio_set_output_value(CFG_FLASH_LED_PIN, 0))
//bt led
#define CFG_BT_LED_PIN IO_PORTA_03

55
apps/kaotings/s3.csv Normal file
View File

@ -0,0 +1,55 @@
三路声光输出仪光频模式采样(6种模式)
序号,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
模式1,时长(s),3,4,3,9,19,5,21,22,23,24,25,26,27,28,29
,频率(Hz),1,5,15,31,7,19,9,10,11,12,13,14,15,16,17
,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
,,10,90,5,45,7,25,75,5,10,90,9,3,14,120,7
,,4,13,6,25,9,3,8,28,11,25,5,17,4,8,31
,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
,,14,3,45,21,75,14,5,,,,,,,,
,,9,12,24,5,11,3,17,9,,,,,,,
,,,,,,,,,,,,,,,
模式2,时长(s),5,11,3,8,17,5,21,3,5,7,9,27,75,5,75
,频率(Hz),1,5,22,26,3,24,9,22,10,25,3,19,6,16,26
,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
,,10,90,5,45,7,25,75,5,7,3,90,9,3,14,120
,,6,17,4,15,9,21,6,14,3,5,26,13,22,3,7
,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
,,7,14,3,45,21,75,14,5,,,,,,,
,,22,8,15,4,9,13,25,13,9,,,,,,,
,,,,,,,,,,,,,,,
模式3,时长(s),6,12,29,7,21,5,21,3,5,7,9,27,75,5,75
,频率(Hz),1,5,22,13,7,17,9,25,10,25,3,25,5,15,25
,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
,,10,90,5,45,7,25,75,5,7,3,90,9,3,14,120
,,13,9,31,22,11,2,23,14,5,24,10,4,19,6,11
,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
,,7,14,3,45,21,75,14,,,,,,,,
,,22,5,19,25,3,9,15,25,,,,,,,
,,,,,,,,,,,,,,,
模式4,时长(s),8,12,3,8,19,5,21,3,5,7,9,27,75,5,75
,频率(Hz),1,5,15,31,11,31,9,16,10,25,3,25,7,17,28
,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
,,10,90,5,45,32,75,5,7,3,90,9,3,14,120,7
,,16,9,3,16,7,12,7,28,13,20,11,29,14,9,3
,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
,,14,3,45,21,75,14,5,,,,,,,,
,,19,7,22,5,11,31,18,9,,,,,,,
,,,,,,,,,,,,,,,
模式5,时长(s),3,9,3,7,15,5,21,3,5,7,9,27,75,5,75
,频率(Hz),1,5,15,29,14,9,6,6,10,25,3,29,13,24,33
,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
,,10,90,5,45,7,25,75,5,7,3,90,9,3,14,120
,,19,5,19,8,2,25,16,7,22,9,16,7,22,3,10
,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
,,7,14,3,66,75,14,5,,,,,,,,
,,31,15,4,26,7,19,3,9,,,,,,,
,,,,,,,,,,,,,,,
模式6,时长(s),8,11,3,7,15,5,21,3,5,7,9,27,75,5,75
,频率(Hz),1,5,15,9,22,4,15,29,10,25,3,15,8,18,29
,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
,,10,90,5,45,7,25,75,5,7,3,90,9,3,14,120
,,4,18,5,31,11,2,29,11,29,17,4,17,50,25,13
,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
,,7,14,3,45,21,75,14,5,,,,,,,
,,2,19,8,16,28,7,15,4,9,,,,,,,
1 三路声光输出仪光频模式采样(6种模式)
2 序号,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
3 模式1,时长(s),3,4,3,9,19,5,21,22,23,24,25,26,27,28,29
4 ,频率(Hz),1,5,15,31,7,19,9,10,11,12,13,14,15,16,17
5 ,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
6 ,,10,90,5,45,7,25,75,5,10,90,9,3,14,120,7
7 ,,4,13,6,25,9,3,8,28,11,25,5,17,4,8,31
8 ,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
9 ,,14,3,45,21,75,14,5,,,,,,,,
10 ,,9,12,24,5,11,3,17,9,,,,,,,
11 ,,,,,,,,,,,,,,,
12 模式2,时长(s),5,11,3,8,17,5,21,3,5,7,9,27,75,5,75
13 ,频率(Hz),1,5,22,26,3,24,9,22,10,25,3,19,6,16,26
14 ,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
15 ,,10,90,5,45,7,25,75,5,7,3,90,9,3,14,120
16 ,,6,17,4,15,9,21,6,14,3,5,26,13,22,3,7
17 ,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
18 ,,7,14,3,45,21,75,14,5,,,,,,,
19 ,,22,8,15,4,9,13,25,13,9,,,,,,,
20 ,,,,,,,,,,,,,,,
21 模式3,时长(s),6,12,29,7,21,5,21,3,5,7,9,27,75,5,75
22 ,频率(Hz),1,5,22,13,7,17,9,25,10,25,3,25,5,15,25
23 ,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
24 ,,10,90,5,45,7,25,75,5,7,3,90,9,3,14,120
25 ,,13,9,31,22,11,2,23,14,5,24,10,4,19,6,11
26 ,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
27 ,,7,14,3,45,21,75,14,,,,,,,,
28 ,,22,5,19,25,3,9,15,25,,,,,,,
29 ,,,,,,,,,,,,,,,
30 模式4,时长(s),8,12,3,8,19,5,21,3,5,7,9,27,75,5,75
31 ,频率(Hz),1,5,15,31,11,31,9,16,10,25,3,25,7,17,28
32 ,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
33 ,,10,90,5,45,32,75,5,7,3,90,9,3,14,120,7
34 ,,16,9,3,16,7,12,7,28,13,20,11,29,14,9,3
35 ,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
36 ,,14,3,45,21,75,14,5,,,,,,,,
37 ,,19,7,22,5,11,31,18,9,,,,,,,
38 ,,,,,,,,,,,,,,,
39 模式5,时长(s),3,9,3,7,15,5,21,3,5,7,9,27,75,5,75
40 ,频率(Hz),1,5,15,29,14,9,6,6,10,25,3,29,13,24,33
41 ,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
42 ,,10,90,5,45,7,25,75,5,7,3,90,9,3,14,120
43 ,,19,5,19,8,2,25,16,7,22,9,16,7,22,3,10
44 ,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
45 ,,7,14,3,66,75,14,5,,,,,,,,
46 ,,31,15,4,26,7,19,3,9,,,,,,,
47 ,,,,,,,,,,,,,,,
48 模式6,时长(s),8,11,3,7,15,5,21,3,5,7,9,27,75,5,75
49 ,频率(Hz),1,5,15,9,22,4,15,29,10,25,3,15,8,18,29
50 ,,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
51 ,,10,90,5,45,7,25,75,5,7,3,90,9,3,14,120
52 ,,4,18,5,31,11,2,29,11,29,17,4,17,50,25,13
53 ,,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45
54 ,,7,14,3,45,21,75,14,5,,,,,,,
55 ,,2,19,8,16,28,7,15,4,9,,,,,,,

View File

@ -347,7 +347,7 @@
* https://fonts.google.com/specimen/Montserrat */
#define LV_FONT_MONTSERRAT_8 0
#define LV_FONT_MONTSERRAT_10 1
#define LV_FONT_MONTSERRAT_12 0
#define LV_FONT_MONTSERRAT_12 1
#define LV_FONT_MONTSERRAT_14 0
#define LV_FONT_MONTSERRAT_16 1
#define LV_FONT_MONTSERRAT_18 0

View File

@ -151,8 +151,8 @@ SD1_PLATFORM_DATA_BEGIN(sd1_data)
#elif (TCFG_SD1_DET_MODE == SD_CLK_DECT)
.detect_io_level = TCFG_SD1_DET_IO_LEVEL,//0低电平检测到卡。 1高电平检测到卡
.detect_func = sdmmc_1_clk_detect,//库函数需要detect_io_level元素作为参数。可以自行重写一个检测函数在线返回1不在线返回0即可。
.power = sd_set_power,//库函数使用SDPG引脚。可以自行重写其他的SD卡电源控制函数传入0关电源。传入1开电源。如果电源硬件已固定不可控则该函数无效可以填NULL
/* .power = NULL, */
//.power = sd_set_power,//库函数使用SDPG引脚。可以自行重写其他的SD卡电源控制函数传入0关电源。传入1开电源。如果电源硬件已固定不可控则该函数无效可以填NULL
.power = NULL, /* */
#else
.detect_func = sdmmc_cmd_detect,
.power = NULL,//cmd检测需要全程供电建议用硬件固定电源。当然可以自行写其他的SD卡电源控制函数传入0关电源。传入1开电源。

View File

@ -27,6 +27,7 @@
//*********************************************************************************//
#define TCFG_APP_BT_EN 1
#define TCFG_APP_MUSIC_EN 1
#define TCFG_MUSIC_SINGLE_PLAY_NO_LOOP 1 /* Music 单曲播放:播完不循环,不自动下一曲 */
#define TCFG_APP_LINEIN_EN 0
#define TCFG_APP_FM_EN 0
#define TCFG_APP_PC_EN 0
@ -58,14 +59,14 @@
//A组IO: SDA: DM SCL: DP B组IO: SDA: PC4 SCL: PC5
//C组IO: SDA: PB4 SCL: PB6 D组IO: SDA: PA5 SCL: PA6
#define TCHFG_HW_I2C_ENABLE ENABLE_THIS_MOUDLE //硬件IIC使能
#define TCHFG_HW_I2C_ENABLE DISABLE_THIS_MOUDLE //硬件IIC使能
#define TCFG_HW_I2C0_PORTS 'C' //选择第几组硬件引脚
#define TCFG_HW_I2C0_CLK 100000 //硬件IIC波特率
//*********************************************************************************//
// 硬件SPI 配置 //
//*********************************************************************************//
#define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE
#define TCFG_HW_SPI1_ENABLE DISABLE_THIS_MOUDLE
//A组IO: DI: PB2 DO: PB1 CLK: PB0
//B组IO: DI: PC3 DO: PC5 CLK: PC4
#define TCFG_HW_SPI1_PORT 'B'
@ -77,14 +78,14 @@
//A组IO: DI: PB8 DO: PB10 CLK: PB9
//B组IO: DI: PA13 DO: DM CLK: DP
#define TCFG_HW_SPI2_PORT 'A'
#define TCFG_HW_SPI2_BAUD 4000000L
#define TCFG_HW_SPI2_BAUD 40000000L
#define TCFG_HW_SPI2_MODE SPI_MODE_UNIDIR_1BIT
#define TCFG_HW_SPI2_ROLE SPI_ROLE_MASTER
//*********************************************************************************//
// FLASH 配置 //
//*********************************************************************************//
#define TCFG_NORFLASH_DEV_ENABLE ENABLE_THIS_MOUDLE
#define TCFG_NORFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_NANDFLASH_DEV_ENABLE DISABLE_THIS_MOUDLE
#define TCFG_FLASH_DEV_SPI_HW_NUM 1// 1: SPI1 2: SPI2
#define TCFG_FLASH_DEV_SPI_CS_PORT IO_PORTC_03
@ -395,7 +396,7 @@ DAC硬件上的连接方式,可选的配置:
#define AUDIO_OUTPUT_WAY AUDIO_OUTPUT_WAY_DAC
#define LINEIN_INPUT_WAY LINEIN_INPUT_WAY_ADC //LINEIN_INPUT_WAY_ANALOG
#define AUDIO_OUTPUT_AUTOMUTE 0//ENABLE
#define AUDIO_OUTPUT_AUTOMUTE 1//ENABLE
#define DAC_AUTO_HIGH_Z_EN DISABLE //处理直推串音问题, 隔直不要开
/*
@ -758,10 +759,10 @@ DAC硬件上的连接方式,可选的配置:
#define TCFG_DEC_G729_ENABLE ENABLE
#define TCFG_DEC_MP3_ENABLE ENABLE
#define TCFG_DEC_WMA_ENABLE ENABLE
#define TCFG_DEC_WAV_ENABLE ENABLE
#define TCFG_DEC_FLAC_ENABLE ENABLE
#define TCFG_DEC_APE_ENABLE ENABLE
#define TCFG_DEC_M4A_ENABLE ENABLE
#define TCFG_DEC_WAV_ENABLE 0
#define TCFG_DEC_FLAC_ENABLE 0
#define TCFG_DEC_APE_ENABLE 0
#define TCFG_DEC_M4A_ENABLE 0
#define TCFG_DEC_ALAC_ENABLE 0
#define TCFG_DEC_AMR_ENABLE 0
#define TCFG_DEC_DTS_ENABLE 0

View File

@ -18,7 +18,7 @@ const u16 bt_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL
},
[2] = {
KEY_MUSIC_PP, KEY_USER_LED, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
KEY_MUSIC_PP, KEY_NULL, KEY_NULL, KEY_NULL, KEY_USER_LED, KEY_NULL
},
[3] = {
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
@ -135,7 +135,7 @@ const u16 music_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL
},
[2] = {
KEY_MUSIC_PP, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
KEY_MUSIC_PP, KEY_USER_SETTING, KEY_NULL, KEY_NULL, KEY_USER_LED, KEY_NULL
},
[3] = {
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
@ -323,16 +323,16 @@ const u16 spdif_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
const u16 idle_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
//单击 //长按 //hold //抬起 //双击 //三击
[0] = {
KEY_USER_BACK, KEY_USER_PWR, KEY_USER_PWR_HOLD, KEY_NULL, KEY_NULL, KEY_NULL
KEY_NULL, KEY_POWER_ON, KEY_POWER_ON_HOLD, KEY_NULL, KEY_NULL, KEY_NULL
},
[1] = {
KEY_USER_PREV, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[2] = {
KEY_USER_ENTER, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[3] = {
KEY_USER_NEXT, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[4] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL

View File

@ -161,16 +161,19 @@ enum {
KEY_TEST_DEMO_0,
KEY_TEST_DEMO_1,
KEY_USER_BACK,
KEY_USER_PREV,
KEY_USER_NEXT,
KEY_USER_ENTER,
KEY_USER_PWR,
KEY_USER_PWR_HOLD,
//KEY_USER_BACK,
//KEY_USER_PREV,
//KEY_USER_NEXT,
//KEY_USER_ENTER,
//KEY_USER_PWR,
//KEY_USER_PWR_HOLD,
KEY_USER_PLAY_TIME_UPDATE,
KEY_USER_APP_BT_START,
KEY_USER_APP_MUSIC_START,
KEY_USER_MUSIC_PLAYING, /* key_value=sclust播放成功后投递UI 高亮对应列表项 */
KEY_USER_EYE_LED_STOP, /* eye LED 37 步完成后投递UI 清除绿色高亮 */
//KEY_USER_APP_BT_START,
//KEY_USER_APP_MUSIC_START,
KEY_USER_LED,
KEY_USER_SETTING,
KEY_IR_NUM_0, //中间不允许插入
KEY_IR_NUM_1,

View File

@ -55,6 +55,7 @@
//
//
#define VM_TWS_ROLE 38
#define CFG_EX_LED_COLOR 39
#if (VM_ITEM_MAX_NUM > 128)

View File

@ -157,7 +157,7 @@ int app_common_key_msg_deal(struct sys_event *event)
power_off_deal(event, key_event - KEY_POWEROFF);
break;
case KEY_USER_APP_BT_START:
/* case KEY_USER_APP_BT_START:
//app_task_switch_to(APP_BT_TASK);
printf("app_common_key_msg_deal: KEY_USER_APP_BT_START\n");
kt_ui_post_key_event(KEY_USER_APP_BT_START, 0);
@ -166,7 +166,7 @@ int app_common_key_msg_deal(struct sys_event *event)
//app_task_switch_to(APP_MUSIC_TASK);
printf("app_common_key_msg_deal: KEY_USER_APP_MUSIC_START\n");
kt_ui_post_key_event(KEY_USER_APP_MUSIC_START, 0);
break;
break; */
case KEY_IR_NUM_0:
case KEY_IR_NUM_1:

View File

@ -39,8 +39,6 @@
**************************************************************/
#include "system/includes.h"
#include "media/includes.h"
@ -65,7 +63,6 @@
#include "math.h"
#include "spp_user.h"
#include "app_protocol_common.h"
#include "app_chargestore.h"
@ -97,7 +94,8 @@
#include "multi_demo/le_multi_common.h"
#include "kt.h"
#include "kt_ui.h"
#include "eye_led.h"
#define LOG_TAG_CONST BT
#define LOG_TAG "[BT]"
@ -108,7 +106,6 @@
#define LOG_CLI_ENABLE
#include "debug.h"
#if TCFG_APP_BT_EN
struct app_bt_opr app_bt_hdl = {
@ -123,8 +120,6 @@ struct app_bt_opr app_bt_hdl = {
BT_USER_PRIV_VAR bt_user_priv_var;
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式变量初始化
@param
@ -137,7 +132,6 @@ void bt_var_init()
memset((u8 *)&bt_user_priv_var, 0, sizeof(BT_USER_PRIV_VAR));
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式协议栈回调函数
@param
@ -182,7 +176,6 @@ void bredr_handle_register()
BT_BREDR_HANDLE_REG();
}
#if (TRANS_MULTI_BLE_EN || TUYA_MULTI_BLE_EN) && TRANS_MULTI_BLE_MASTER_NUMS
// 指定搜索uuid
// 指定搜索uuid
@ -229,7 +222,6 @@ static const target_uuid_t jl_search_uuid_table[] = {
};
static void ble_report_data_deal(att_data_report_t *report_data, target_uuid_t *search_uuid)
{
log_info("conn_handle:%04x,report_data:%02x,%02x,%d,len(%d)", report_data->conn_handle, report_data->packet_type,
@ -242,7 +234,8 @@ static void ble_report_data_deal(att_data_report_t *report_data, target_uuid_t *
/* return; */
/* } */
switch (report_data->packet_type) {
switch (report_data->packet_type)
{
case GATT_EVENT_NOTIFICATION: // notify
break;
@ -285,10 +278,12 @@ static void client_test_write(void)
u16 tmp_handle;
count++;
for (i = 0; i < TRANS_MULTI_BLE_MASTER_NUMS; i++) {
for (i = 0; i < TRANS_MULTI_BLE_MASTER_NUMS; i++)
{
tmp_handle = mul_dev_get_conn_handle(i, MULTI_ROLE_CLIENT);
if (tmp_handle && ble_client_write_handle) {
if (tmp_handle && ble_client_write_handle)
{
ret = ble_client_api->opt_comm_send_ext(tmp_handle, ble_client_write_handle, &count, 16, ATT_OP_WRITE_WITHOUT_RESPOND);
log_info("test_write:%04x,%d", tmp_handle, ret);
}
@ -298,19 +293,22 @@ static void client_test_write(void)
/* log_info("test_write:%x", ret); */
}
static void client_event_callback(le_client_event_e event, u8 *packet, int size)
{
switch (event) {
case CLI_EVENT_MATCH_DEV: {
switch (event)
{
case CLI_EVENT_MATCH_DEV:
{
client_match_cfg_t *match_dev = packet;
log_info("match_name:%s\n", match_dev->compare_data);
}
break;
case CLI_EVENT_MATCH_UUID: {
case CLI_EVENT_MATCH_UUID:
{
opt_handle_t *opt_hdl = packet;
if (opt_hdl->search_uuid == &jl_search_uuid_table[0]) {
if (opt_hdl->search_uuid == &jl_search_uuid_table[0])
{
ble_client_write_handle = opt_hdl->value_handle;
log_info("match_uuid22\n");
}
@ -319,7 +317,8 @@ static void client_event_callback(le_client_event_e event, u8 *packet, int size)
case CLI_EVENT_SEARCH_PROFILE_COMPLETE:
log_info("CLI_EVENT_SEARCH_PROFILE_COMPLETE\n");
if ((!ble_client_timer) && ble_client_write_handle) {
if ((!ble_client_timer) && ble_client_write_handle)
{
log_info("test timer_add\n");
ble_client_timer = sys_timer_add(0, client_test_write, 500);
}
@ -329,7 +328,8 @@ static void client_event_callback(le_client_event_e event, u8 *packet, int size)
break;
case CLI_EVENT_DISCONNECT:
if (ble_client_timer && TRANS_MULTI_BLE_MASTER_NUMS == 1) {
if (ble_client_timer && TRANS_MULTI_BLE_MASTER_NUMS == 1)
{
sys_timeout_del(ble_client_timer);
ble_client_write_handle = 0;
ble_client_timer = 0;
@ -341,7 +341,6 @@ static void client_event_callback(le_client_event_e event, u8 *packet, int size)
}
}
static const client_conn_cfg_t client_conn_config = {
.match_dev_cfg[0] = &match_dev01,
.match_dev_cfg[1] = NULL,
@ -423,7 +422,6 @@ void bt_function_select_init()
// authentication_requirements: 0:not protect 1 :protect
__set_simple_pair_param(3, 0, 2);
#if (USER_SUPPORT_PROFILE_PBAP == 1)
////设置蓝牙设备类型
__change_hci_class_type(BD_CLASS_CAR_AUDIO);
@ -434,7 +432,6 @@ void bt_function_select_init()
lmp_set_sniff_disable();
#endif
/*
TX RX
AI800x PA13 PA12
@ -453,8 +450,7 @@ void bt_function_select_init()
#if TCFG_USER_BLE_ENABLE
{
u8 tmp_ble_addr[6];
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV \
|| TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_GMA)
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV || TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_GMA)
/* bt_set_tx_power(9);//ble txpwer level:0~9 */
memcpy(tmp_ble_addr, (void *)bt_get_mac_addr(), 6);
#else
@ -470,7 +466,6 @@ void bt_function_select_init()
ble_client_config_init();
#endif
#endif // TCFG_USER_BLE_ENABLE
#if (CONFIG_BT_MODE != BT_NORMAL)
@ -478,7 +473,6 @@ void bt_function_select_init()
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式协议栈对应状态处理函数
@param bt:
@ -491,11 +485,13 @@ static int bt_connction_status_event_handler(struct bt_event *bt)
log_debug("-----------------------bt_connction_status_event_handler %d", bt->event);
if (bt_status_event_filter(bt) == false) {
if (bt_status_event_filter(bt) == false)
{
return false;
}
switch (bt->event) {
switch (bt->event)
{
case BT_STATUS_EXIT_OK:
log_info("BT_STATUS_EXIT_OK\n");
break;
@ -607,12 +603,6 @@ static int bt_connction_status_event_handler(struct bt_event *bt)
return 0;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式协议栈事件
@param bt:
@ -625,11 +615,13 @@ static int bt_hci_event_handler(struct bt_event *bt)
// 对应原来的蓝牙连接上断开处理函数 ,bt->value=reason
log_debug("------------------------bt_hci_event_handler reason %x %x", bt->event, bt->value);
if (bt_hci_event_filter(bt) == 0) {
if (bt_hci_event_filter(bt) == 0)
{
return 0;
}
switch (bt->event) {
switch (bt->event)
{
case HCI_EVENT_INQUIRY_COMPLETE:
log_info(" HCI_EVENT_INQUIRY_COMPLETE \n");
bt_hci_event_inquiry(bt);
@ -668,7 +660,8 @@ static int bt_hci_event_handler(struct bt_event *bt)
case BTSTACK_EVENT_HCI_CONNECTIONS_DELETE:
case HCI_EVENT_CONNECTION_COMPLETE:
log_info(" HCI_EVENT_CONNECTION_COMPLETE \n");
switch (bt->value) {
switch (bt->value)
{
case ERROR_CODE_SUCCESS:
log_info("ERROR_CODE_SUCCESS \n");
bt_hci_event_connection(bt);
@ -708,8 +701,6 @@ static int bt_hci_event_handler(struct bt_event *bt)
return 0;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙后台事件过滤处理
@param event:
@ -721,12 +712,15 @@ int bt_background_event_handler_filter(struct sys_event *event)
{
u8 ret = 0;
#if TCFG_BLUETOOTH_BACK_MODE
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS)
{
log_info("bt con event: %d \n", event->u.bt.event);
switch (event->u.bt.event) {
switch (event->u.bt.event)
{
// 需要切换蓝牙的命令
case BT_STATUS_A2DP_MEDIA_START:
if (__this->sbc_packet_step != 0) {
if (__this->sbc_packet_step != 0)
{
/* log_info("sbc_packet_step : %d \n", __this->sbc_packet_step); */
break;
}
@ -734,7 +728,8 @@ int bt_background_event_handler_filter(struct sys_event *event)
case BT_STATUS_FIRST_DISCONNECT:
case BT_STATUS_SECOND_DISCONNECT:
// 关机导致的断开不可以回去蓝牙,否则后台关机会有问题
if (app_var.goto_poweroff_flag) {
if (app_var.goto_poweroff_flag)
{
break;
}
#if BACKGROUND_GOBACK
@ -746,10 +741,12 @@ int bt_background_event_handler_filter(struct sys_event *event)
#else
// 判断断开的是sink设备默认切换蓝牙
if (event->u.bt.value) {
if (event->u.bt.value)
{
ret = 1;
}
if (ret == 0) {
if (ret == 0)
{
bt_status_disconnect_background(&event->u.bt);
}
#endif
@ -807,9 +804,12 @@ int bt_background_event_handler_filter(struct sys_event *event)
bt_connction_status_event_handler(&event->u.bt);
break;
}
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
}
else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS)
{
/* log_info("bt hci event: %d \n", event->u.bt.event); */
switch (event->u.bt.event) {
switch (event->u.bt.event)
{
case HCI_EVENT_IO_CAPABILITY_REQUEST:
clock_add_set(BT_CONN_CLK);
#if BACKGROUND_GOBACK
@ -826,9 +826,11 @@ int bt_background_event_handler_filter(struct sys_event *event)
}
}
#if TCFG_USER_TWS_ENABLE
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS))
{
/* log_info("bt tws event: %d \n", event->u.bt.event); */
switch (event->u.bt.event) {
switch (event->u.bt.event)
{
/* case TWS_EVENT_CONNECTED: */
/* ret = 1; */
/* break; */
@ -841,8 +843,10 @@ int bt_background_event_handler_filter(struct sys_event *event)
}
}
#endif
else if ((u32)event->arg == SYS_EVENT_FROM_CTRLER) {
switch (event->u.bt.event) {
else if ((u32)event->arg == SYS_EVENT_FROM_CTRLER)
{
switch (event->u.bt.event)
{
case BTCTRLER_EVENT_RESUME_REQ:
/*log_info("------- BTCTRLER_EVENT_RESUME_REQ \n"); */
ret = 2;
@ -863,12 +867,17 @@ int bt_background_event_handler_filter(struct sys_event *event)
int bt_background_event_handler(struct sys_event *event)
{
int ret = bt_background_event_handler_filter(event);
if (ret) {
if (false == app_check_curr_task(APP_BT_TASK)) {
if (ret)
{
if (false == app_check_curr_task(APP_BT_TASK))
{
__this->cmd_flag = 1;
if (ret == 2) {
if (ret == 2)
{
__this->call_flag = 1;
} else {
}
else
{
__this->call_flag = 0;
}
app_task_switch_to(APP_BT_TASK);
@ -878,7 +887,6 @@ int bt_background_event_handler(struct sys_event *event)
return 0;
}
// #if (USER_SUPPORT_PROFILE_HID==1)
////重写bt_get_hid_name
// const char * bt_get_hid_name()
@ -899,25 +907,29 @@ int bt_key_event_handler(struct sys_event *event)
int ret = true;
struct key_event *key = &event->u.key;
if (bt_key_event_filter_before() == false) {
if (bt_key_event_filter_before() == false)
{
return false;
}
int key_event = event->u.key.event;
int key_value = event->u.key.value;
log_debug("bt key_event:%d %d %d %d\n", key_event, key->value, key->event, key->init);
if (bt_key_event_filter_after(key_event) == true) {
if (bt_key_event_filter_after(key_event) == true)
{
return true;
}
//if (kt_key_event_filter_after(key_event, key_value) == true) {
// return true;
//}
/* kt_ui 优先:若消费则不再交给 BT 逻辑 */
if (kt_key_event_filter_after(key_event, key_value) == true)
{
return true;
}
switch (key_event) {
switch (key_event)
{
case KEY_MUSIC_PP:
log_info(" KEY_MUSIC_PP \n");
@ -971,7 +983,8 @@ int bt_key_event_handler(struct sys_event *event)
log_info(" KEY_NULL \n");
ret = false;
#if TCFG_USER_TWS_ENABLE
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
if ((u32)event->arg == KEY_EVENT_FROM_TWS)
{
break;
}
#endif
@ -987,7 +1000,8 @@ int bt_key_event_handler(struct sys_event *event)
#endif
break;
case KEY_HID_TAKE_PICTURE:
if (__this->hid_mode) {
if (__this->hid_mode)
{
printf("KEY_HID_TAKE_PICTURE\n");
user_send_cmd_prepare(USER_CTRL_HID_BOTH, 0, NULL);
}
@ -998,11 +1012,15 @@ int bt_key_event_handler(struct sys_event *event)
#if (TCFG_DEC2TWS_ENABLE)
ret = false;
#else
if (tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED) {
if (tws_api_get_role() == TWS_ROLE_MASTER) {
if (tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED)
{
if (tws_api_get_role() == TWS_ROLE_MASTER)
{
bt_tws_api_push_cmd(SYNC_CMD_MODE_CHANGE, 400);
}
} else {
}
else
{
ret = false;
break;
}
@ -1022,7 +1040,6 @@ int bt_key_event_handler(struct sys_event *event)
return ret;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式协议栈状态事件、hci事件、对箱事件
@param event:
@ -1033,20 +1050,28 @@ int bt_key_event_handler(struct sys_event *event)
int bt_sys_event_office(struct sys_event *event)
{
u8 ret = false;
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS)
{
bt_connction_status_event_handler(&event->u.bt);
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
}
else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS)
{
bt_hci_event_handler(&event->u.bt);
} else if ((u32)event->arg == SYS_BT_EVENT_FORM_SELF) {
}
else if ((u32)event->arg == SYS_BT_EVENT_FORM_SELF)
{
bt_reverb_status_change(&event->u.bt);
}
#if TCFG_USER_TWS_ENABLE
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS))
{
ret = bt_tws_connction_status_event_handler(&event->u.bt);
}
#endif
else if (((u32)event->arg == SYS_BT_EVENT_FROM_KEY)) {
switch (event->u.key.event) {
else if (((u32)event->arg == SYS_BT_EVENT_FROM_KEY))
{
switch (event->u.key.event)
{
case KEY_CHANGE_MODE:
app_task_switch_next();
break;
@ -1055,7 +1080,6 @@ int bt_sys_event_office(struct sys_event *event)
return ret;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式事件消息处理
@param event:
@ -1066,7 +1090,8 @@ int bt_sys_event_office(struct sys_event *event)
static int bt_sys_event_handler(struct sys_event *event)
{
int ret = false;
switch (event->type) {
switch (event->type)
{
case SYS_KEY_EVENT:
ret = bt_key_event_handler(event);
break;
@ -1075,7 +1100,8 @@ static int bt_sys_event_handler(struct sys_event *event)
break;
case SYS_DEVICE_EVENT:
#if APP_ONLINE_DEBUG
if ((u32)event->arg == DEVICE_EVENT_ONLINE_DATA) {
if ((u32)event->arg == DEVICE_EVENT_ONLINE_DATA)
{
// putchar('%');
extern void app_online_event_handle(int evt_value);
app_online_event_handle(event->u.dev.value);
@ -1101,12 +1127,14 @@ static void bt_tone_play_end_callback(void *priv, int flag)
{
u32 index = (u32)priv;
if (APP_BT_TASK != app_get_curr_task()) {
if (APP_BT_TASK != app_get_curr_task())
{
log_error("tone callback task out \n");
return;
}
switch (index) {
switch (index)
{
case IDEX_TONE_BT_MODE:
/// 提示音播放结束, 启动播放器播放
bt_task_start();
@ -1116,6 +1144,38 @@ static void bt_tone_play_end_callback(void *priv, int flag)
}
}
// bt status led
static u16 led_timer = 0;
static u8 led_status = 0;
static void led_timer_callback(void *priv)
{
if (get_bt_connect_status() >= BT_STATUS_CONNECTING)
{
BT_LED_ON();
}
else
{
led_status = !led_status;
if (led_status)
{
BT_LED_ON();
}
else
{
BT_LED_OFF();
}
}
}
static void start_led_timer(void)
{
if (led_timer != 0)
{
sys_timer_del(led_timer);
led_timer = 0;
}
led_timer = sys_timer_add(NULL, led_timer_callback, 250);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式
@param
@ -1128,6 +1188,8 @@ void app_bt_task()
int res;
int msg[32];
ui_update_status(STATUS_EXIT_LOWPOWER);
eye_led_stop(); // 仅在music模式下才有eye led所以这里需要停止eye led
kt_ui_show_page(KT_PAGE_BT);
bt_task_init(); // 初始化变量、时钟、显示(未进行协议栈初始化)
@ -1136,36 +1198,47 @@ void app_bt_task()
tone2tws_bt_task_start(!__this->cmd_flag);
#endif
app_task_put_key_msg(KEY_USER_APP_BT_START, 0);
// app_task_put_key_msg(KEY_USER_APP_BT_START, 0);
extern u8 get_tws_background_connected_flag();
if (!__this->cmd_flag && (!get_tws_background_connected_flag())) { //蓝牙后台拉回蓝牙模式不播放提示音
if (!__this->cmd_flag && (!get_tws_background_connected_flag()))
{ // 蓝牙后台拉回蓝牙模式不播放提示音
tone_play_with_callback_by_name(tone_table[IDEX_TONE_BT_MODE], 1, bt_tone_play_end_callback, (void *)IDEX_TONE_BT_MODE);
// 协议栈初始化在提示音结束进行
} else {
}
else
{
// 后台返回的情况没有播放提示音需要在这里进行协议栈的resume
bt_task_start();
}
#if TCFG_DEC2TWS_ENABLE
extern void set_tws_background_connected_flag(u8 flag);
if (get_tws_background_connected_flag()) {
if (get_tws_background_connected_flag())
{
int state = tws_api_get_tws_state();
if (state & TWS_STA_SIBLING_CONNECTED) {
if (tws_api_get_role() == TWS_ROLE_MASTER) {
if (state & TWS_STA_SIBLING_CONNECTED)
{
if (tws_api_get_role() == TWS_ROLE_MASTER)
{
app_task_switch_back();
} else {
}
else
{
set_tws_background_connected_flag(0);
}
}
}
#endif
while (1) {
while (1)
{
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
switch (msg[0]) {
switch (msg[0])
{
case APP_MSG_SYS_EVENT:
if (bt_sys_event_handler((struct sys_event *)(msg + 1)) == false) {
if (bt_sys_event_handler((struct sys_event *)(msg + 1)) == false)
{
app_default_event_deal((struct sys_event *)(&msg[1]));
}
break;
@ -1173,32 +1246,45 @@ void app_bt_task()
break;
}
#if TCFG_BLUETOOTH_BACK_MODE
if (!__this->init_ok && !app_var.goto_poweroff_flag) {
if (!__this->init_ok && !app_var.goto_poweroff_flag)
{
// 蓝牙后台方案必须要等待协议栈初始化完成
continue;
}
#else
if (__this->init_start && (!__this->init_ok)) { //协议栈已经初始化 但没有初始化完成
if (__this->init_start && (!__this->init_ok))
{ // 协议栈已经初始化 但没有初始化完成
// 需要等待初始化完成才可以走退出流程
continue;
}
#endif
if (app_task_exitting()) {
if (__this->init_start) {
if (app_task_exitting())
{
if (led_timer != 0)
{
sys_timer_del(led_timer);
led_timer = 0;
}
led_status = 0;
BT_LED_OFF();
if (__this->init_start)
{
bt_task_close();
__this->wait_exit = 1;
} else { //蓝牙协议栈没有初始化,可以直接退出
}
else
{ // 蓝牙协议栈没有初始化,可以直接退出
bt_task_close();
return;
}
}
if (__this->wait_exit) { //开始退出
if (!__this->exiting) { ///等待蓝牙退出处理完成
if (__this->wait_exit)
{ // 开始退出
if (!__this->exiting)
{ /// 等待蓝牙退出处理完成
__this->wait_exit = 0;
return;
}
@ -1227,7 +1313,6 @@ int bt_background_event_handler_filter(struct sys_event *event)
return 0;
}
u8 get_call_status()
{
return BT_CALL_HANGUP;

View File

@ -302,7 +302,12 @@ static int idle_key_event_opr(struct sys_event *event)
switch (key_event)
{
case KEY_USER_PWR:
case KEY_POWER_ON:
case KEY_POWER_ON_HOLD:
idle_key_poweron_deal(key_event - KEY_POWER_ON);
ret = true;
break;
/* case KEY_USER_PWR:
printf("KEY_USER_PWR\n");
break;
case KEY_USER_PWR_HOLD:
@ -323,7 +328,7 @@ static int idle_key_event_opr(struct sys_event *event)
case KEY_USER_ENTER:
printf("KEY_USER_ENTER\n");
kt_ui_post_key_event(key_event, key_value);
break;
break; */
default:
ret = false;
break;

View File

@ -20,6 +20,9 @@
#include "system/fs/fs.h"
#include "user_api/app_status_api.h"
#include "kt.h"
#include "kt_ui.h"
/*************************************************************
music模式按键处理和事件处理
@ -48,13 +51,15 @@
static u8 music_idle_flag = 1;
/// 模式参数结构体
struct __music_task_parm {
struct __music_task_parm
{
u8 type;
int val;
};
/// music模式控制结构体
struct __music {
struct __music
{
struct __music_task_parm task_parm;
u16 file_err_counter; // 错误文件统计
u8 file_play_direct; // 0:下一曲, 1上一曲
@ -69,20 +74,21 @@ struct __music music_hdl;
static struct __breakpoint *breakpoint = NULL;
static void music_player_play_start(void);
/// 设备提示音使能
#define MUSIC_DEVICE_TONE_EN 0
#if (MUSIC_DEVICE_TONE_EN)
struct __dev_tone {
struct __dev_tone
{
char *logo;
char *phy_logo;
char *tone_path;
u16 index;
};
enum {
enum
{
/// 0x1000起始为了不要跟提示音的IDEX_TONE_重叠了
DEVICE_INDEX_UDISK = 0x1000,
DEVICE_INDEX_UDISK_REC,
@ -102,17 +108,21 @@ const struct __dev_tone device_tone[] = {
static void music_tone_play_end_callback(void *priv, int flag);
int music_device_tone_play(char *logo)
{
if (logo == NULL) {
if (logo == NULL)
{
return false;
}
printf("__this->device_tone_dev = %s, logo =%s\n", __this->device_tone_dev, logo);
char *phy_logo = dev_manager_get_phy_logo(dev_manager_find_spec(logo, 0));
if (phy_logo && (strcmp(__this->device_tone_dev, phy_logo) == 0)) {
if (phy_logo && (strcmp(__this->device_tone_dev, phy_logo) == 0))
{
log_i("[%s, %d]the same phy dev, no need device tone!!\n", logo, __LINE__);
return false;
}
for (int i = 0; i < ARRAY_SIZE(device_tone); i++) {
if (strcmp(device_tone[i].logo, logo) == 0) {
for (int i = 0; i < ARRAY_SIZE(device_tone); i++)
{
if (strcmp(device_tone[i].logo, logo) == 0)
{
log_i("[%s, %d]device_tone play \n", logo, __LINE__);
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
memcpy(__this->device_tone_dev, device_tone[i].phy_logo, strlen(device_tone[i].phy_logo));
@ -125,8 +135,6 @@ int music_device_tone_play(char *logo)
}
#endif
#if TCFG_LFN_EN
static u8 music_file_name[128] = {0}; // 长文件名
u16 music_file_name_len = 0;
@ -137,7 +145,8 @@ u16 music_file_name_len = 0;
const char *music_file_get_cur_name(int *len, int *is_unicode)
{
if (music_file_name[0] == '\\' && music_file_name[1] == 'U') {
if (music_file_name[0] == '\\' && music_file_name[1] == 'U')
{
*is_unicode = 1;
*len = music_file_name_len - 2;
return (const char *)(music_file_name + 2);
@ -147,26 +156,28 @@ const char *music_file_get_cur_name(int *len, int *is_unicode)
return (const char *)music_file_name;
}
static void music_set_dev_sync_mode(char *logo, u8 mode)
{
if (logo) {
if (logo)
{
struct imount *mount_hdl = NULL;
u8 async_mode = mode;
if ((!memcmp(logo, "udisk0", strlen("udisk0")))
|| (!memcmp(logo, "udisk0_rec", strlen("udisk0_rec")))) {
if ((!memcmp(logo, "udisk0", strlen("udisk0"))) || (!memcmp(logo, "udisk0_rec", strlen("udisk0_rec"))))
{
struct file_dec_hdl *dec = get_file_dec_hdl();
if (dec) {
if (dec)
{
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec(logo, 0));
if (mount_hdl) {
if (dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_APE
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_FLAC
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_DTS
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_WAV) {
if (mount_hdl)
{
if (dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_APE || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_FLAC || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_DTS || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_WAV)
{
/// 指定解码格式开启该功能
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
} else {
}
else
{
/// 不指定的解码格式不开启
async_mode = 0;
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
@ -174,10 +185,13 @@ static void music_set_dev_sync_mode(char *logo, u8 mode)
printf("udisk, set usb ASYNC = %d\n", async_mode);
}
}
} else {
}
else
{
// 不是udisk, 如果udisk在线 将udisk设置成非AYSNC_MODE
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec("udisk0", 0));
if (mount_hdl) {
if (mount_hdl)
{
async_mode = 0;
printf("not udisk, set usb ASYNC = 0\n");
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
@ -186,7 +200,6 @@ static void music_set_dev_sync_mode(char *logo, u8 mode)
}
}
//*----------------------------------------------------------------------------*/
/**@brief music 解码成功回调
@param priv: parm:
@ -213,19 +226,21 @@ static void music_player_play_success(void *priv, int parm)
log_i("file indir = %d\n", music_player_get_fileindir_number());
music_file_name_len = fget_name(music_player_get_file_hdl(), music_file_name, sizeof(music_file_name));
int unicode = 0;
if ((music_file_name[0] == '\\') && (music_file_name[1] == 'U')) {
if ((music_file_name[0] == '\\') && (music_file_name[1] == 'U'))
{
unicode = 1;
music_file_name_len -= 2;
log_i("cur file = %s, len = %d, unicode = %d\n", music_file_name + 2, music_file_name_len, unicode);
} else {
}
else
{
log_i("cur file = %s, len = %d, unicode = %d\n", music_file_name, music_file_name_len, unicode);
}
log_i("\n");
/// save breakpoint, 只保存文件信息
if (music_player_get_playing_breakpoint(breakpoint, 0) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 0) == true)
{
breakpoint_vm_write(breakpoint, logo);
}
@ -233,10 +248,11 @@ static void music_player_play_success(void *priv, int parm)
/// show ui
UI_SHOW_MENU(MENU_FILENUM, 1000, music_player_get_file_cur(), NULL);
UI_MSG_POST("music_start:show_lyric=%4:dev=%4:filenum=%4:total_filenum=%4", !analaz, logo, music_player_get_file_cur(), music_player_get_file_total());
/* 投递消息给 kt_ui高亮当前播放文件列表项 */
kt_ui_post_key_event(KEY_USER_MUSIC_PLAYING, (int)music_player_get_file_sclust());
/// smartbox info update
SMARTBOX_UPDATE(MUSIC_FUNCTION_MASK,
BIT(MUSIC_INFO_ATTR_STATUS) | BIT(MUSIC_INFO_ATTR_FILE_NAME) | BIT(MUSIC_INFO_ATTR_FILE_PLAY_MODE));
}
//*----------------------------------------------------------------------------*/
/**@brief music 解码结束回调处理
@ -281,35 +297,44 @@ static int music_player_scandisk_break(void)
char *logo = NULL;
char *evt_logo = NULL;
app_task_get_msg(msg, ARRAY_SIZE(msg), 0);
switch (msg[0]) {
switch (msg[0])
{
case APP_MSG_SYS_EVENT:
event = (struct sys_event *)(&msg[1]);
switch (event->type) {
switch (event->type)
{
case SYS_DEVICE_EVENT:
switch ((u32)event->arg) {
switch ((u32)event->arg)
{
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
evt_logo = (char *)event->u.dev.value;
case DEVICE_EVENT_FROM_OTG:
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG)
{
evt_logo = (char *)"udisk0";
}
/// 设备上下线底层推出的设备逻辑盘符是跟跟音乐设备一致的(音乐/录音设备, 详细看接口注释)
int str_len = 0;
logo = music_player_get_phy_dev(&str_len);
/// 响应设备插拔打断
if (event->u.dev.event == DEVICE_EVENT_OUT) {
if (event->u.dev.event == DEVICE_EVENT_OUT)
{
log_i("__func__ = %s logo=%s evt_logo=%s %d\n", __FUNCTION__, logo, evt_logo, str_len);
if (logo && (0 == memcmp(logo, evt_logo, str_len))) {
if (logo && (0 == memcmp(logo, evt_logo, str_len)))
{
/// 相同的设备才响应
__this->scandisk_break = 1;
}
} else {
}
else
{
/// 响应新设备上线
__this->scandisk_break = 1;
}
if (__this->scandisk_break == 0) {
if (__this->scandisk_break == 0)
{
log_i("__func__ = %s DEVICE_EVENT_OUT TODO\n", __FUNCTION__);
dev_status_event_filter(event);
log_i("__func__ = %s DEVICE_EVENT_OUT OK\n", __FUNCTION__);
@ -318,12 +343,14 @@ static int music_player_scandisk_break(void)
}
break;
case SYS_BT_EVENT:
if (bt_background_event_handler_filter(event)) {
if (bt_background_event_handler_filter(event))
{
__this->scandisk_break = 1;
}
break;
case SYS_KEY_EVENT:
switch (event->u.key.event) {
switch (event->u.key.event)
{
case KEY_CHANGE_MODE:
/// 响应切换模式事件
__this->scandisk_break = 1;
@ -331,7 +358,8 @@ static int music_player_scandisk_break(void)
// 其他按键case 在这里增加
}
/// 因为TWS转发sys_event_notify需要用原始的按键序号 未经过按键表处理, 所以这里要特殊处理
if (__this->scandisk_break) {
if (__this->scandisk_break)
{
app_task_put_key_msg(event->u.key.event, (int)event->u.key.value);
printf("key break scan!!");
return 1;
@ -340,12 +368,15 @@ static int music_player_scandisk_break(void)
}
break;
}
if (__this->scandisk_break) {
if (__this->scandisk_break)
{
/// 查询到需要打断的事件, 返回1 并且重新推送一次该事件,跑主循环处理流程
sys_event_notify(event);
printf("scandisk_break!!!!!!\n");
return 1;
} else {
}
else
{
return 0;
}
}
@ -361,11 +392,13 @@ static void scan_enter(struct __dev *dev)
{
#if SD_BAUD_RATE_CHANGE_WHEN_SCAN
struct imount *mount_hdl = dev_manager_get_mount_hdl(dev);
if (mount_hdl) {
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0")))
|| (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1")))) {
if (mount_hdl)
{
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0"))) || (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1"))))
{
dev_ioctl(mount_hdl->dev.fd, IOCTL_GET_SPEED, (u32)&__this->old_speed); // 获取sd速度
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed) { //设定速度大于获取的才加速
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed)
{ // 设定速度大于获取的才加速
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_SPEED, SD_BAUD_RATE_CHANGE_WHEN_SCAN);
}
}
@ -378,10 +411,12 @@ static void scan_exit(struct __dev *dev)
{
#ifdef SD_BAUD_RATE_CHANGE_WHEN_SCAN
struct imount *mount_hdl = dev_manager_get_mount_hdl(dev);
if (mount_hdl) {
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0")))
|| (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1")))) {
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed) {
if (mount_hdl)
{
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0"))) || (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1"))))
{
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed)
{
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_SPEED, __this->old_speed); // 恢复原速
}
}
@ -408,12 +443,14 @@ static void music_tone_play_end_callback(void *priv, int flag)
u32 index = (u32)priv;
char *logo = NULL;
if (APP_MUSIC_TASK != app_get_curr_task()) {
if (APP_MUSIC_TASK != app_get_curr_task())
{
log_error("tone callback task out \n");
return;
}
switch (index) {
switch (index)
{
case IDEX_TONE_MUSIC:
/// 提示音播放结束, 启动播放器播放
music_player_play_start();
@ -425,8 +462,10 @@ static void music_tone_play_end_callback(void *priv, int flag)
case DEVICE_INDEX_SD0_REC:
case DEVICE_INDEX_SD1:
case DEVICE_INDEX_SD1_REC:
for (int i = 0; i < ARRAY_SIZE(device_tone); i++) {
if (index == device_tone[i].index) {
for (int i = 0; i < ARRAY_SIZE(device_tone); i++)
{
if (index == device_tone[i].index)
{
logo = device_tone[i].logo;
break;
}
@ -439,7 +478,6 @@ static void music_tone_play_end_callback(void *priv, int flag)
}
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式解码错误处理
@param err:MUSIC_PLAYER错误码表枚举
@ -451,15 +489,18 @@ void music_player_err_deal(int err)
{
u16 msg = KEY_NULL;
char *logo = NULL;
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_ERR_DECODE_FAIL) {
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_ERR_DECODE_FAIL)
{
__this->file_err_counter = 0; /// 清除错误文件累计
}
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC) {
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC)
{
log_e("music player err = %d\n", err);
}
switch (err) {
switch (err)
{
case MUSIC_PLAYER_SUCC:
__this->file_err_counter = 0;
break;
@ -470,35 +511,48 @@ void music_player_err_deal(int err)
msg = KEY_MUSIC_PLAYER_QUIT; // 退出音乐模式
break;
case MUSIC_PLAYER_ERR_DECODE_FAIL:
if (__this->file_err_counter >= music_player_get_file_total()) {
if (__this->file_err_counter >= music_player_get_file_total())
{
__this->file_err_counter = 0;
dev_manager_set_valid_by_logo(music_player_get_dev_cur(), 0); /// 将设备设置为无效设备
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0获取所有设备
if (dev_manager_get_total(1) == 0)
{ // 参数为1 :获取所有有效设备 参数0获取所有设备
msg = KEY_MUSIC_PLAYER_QUIT; // 没有设备了,退出音乐模式
} else {
}
else
{
msg = KEY_MUSIC_AUTO_NEXT_DEV; /// 所有文件都是错误的, 切换到下一个设备
}
} else {
}
else
{
__this->file_err_counter++;
if (__this->file_play_direct == 0) {
if (__this->file_play_direct == 0)
{
msg = KEY_MUSIC_NEXT; // 播放下一曲
} else {
}
else
{
msg = KEY_MUSIC_PREV; // 播放上一曲
}
}
break;
case MUSIC_PLAYER_ERR_DEV_NOFOUND:
log_e("MUSIC_PLAYER_ERR_DEV_NOFOUND \n");
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0获取所有设备
if (dev_manager_get_total(1) == 0)
{ // 参数为1 :获取所有有效设备 参数0获取所有设备
msg = KEY_MUSIC_PLAYER_QUIT; /// 没有设备在线, 退出音乐模式
} else {
}
else
{
msg = KEY_MUSIC_PLAYER_START; /// 没有找到指定设备, 播放之前的活动设备
}
break;
case MUSIC_PLAYER_ERR_FSCAN:
/// 需要结合music_player_scandisk_break中处理的标志位处理
if (__this->scandisk_break) {
if (__this->scandisk_break)
{
__this->scandisk_break = 0;
/// 此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
break;
@ -507,45 +561,59 @@ void music_player_err_deal(int err)
case MUSIC_PLAYER_ERR_DEV_OFFLINE:
log_e("MUSIC_PLAYER_ERR_DEV_OFFLINE \n");
logo = music_player_get_dev_cur();
if (dev_manager_online_check_by_logo(logo, 1)) {
if (dev_manager_online_check_by_logo(logo, 1))
{
/// 如果错误失败在线, 并且是播放过程中产生的,先记录下断点
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
music_player_stop(0); // 先停止防止下一步操作VM卡顿
breakpoint_vm_write(breakpoint, logo);
}
if (err == MUSIC_PLAYER_ERR_FSCAN) {
if (err == MUSIC_PLAYER_ERR_FSCAN)
{
dev_manager_set_valid_by_logo(logo, 0); /// 将设备设置为无效设备
} else {
}
else
{
// 针对读错误, 因为时间推到应用层有延时导致下一个模式判断不正常, 此处需要将设备卸载
dev_manager_unmount(logo);
}
}
if (dev_manager_get_total(1) == 0) {
if (dev_manager_get_total(1) == 0)
{
app_status_handler(APP_STATUS_MUSIC_QUIT);
msg = KEY_MUSIC_PLAYER_QUIT; /// 没有设备在线, 退出音乐模式
} else {
}
else
{
msg = KEY_MUSIC_AUTO_NEXT_DEV; /// 切换设备
}
break;
case MUSIC_PLAYER_ERR_FILE_NOFOUND:
/// 查找文件有扫盘的可能也需要结合music_player_scandisk_break中处理的标志位处理
if (__this->scandisk_break) {
if (__this->scandisk_break)
{
__this->scandisk_break = 0;
/// 此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
break;
}
case MUSIC_PLAYER_ERR_PARM:
logo = music_player_get_dev_cur();
if (dev_manager_online_check_by_logo(logo, 1)) {
if (music_player_get_file_total()) {
if (dev_manager_online_check_by_logo(logo, 1))
{
if (music_player_get_file_total())
{
msg = KEY_MUSIC_PLAYER_PLAY_FIRST; /// 有文件,播放第一个文件
break;
}
}
if (dev_manager_get_total(1) == 0) {
if (dev_manager_get_total(1) == 0)
{
msg = KEY_MUSIC_PLAYER_QUIT; // 没有设备了,退出音乐模式
} else {
}
else
{
msg = KEY_MUSIC_AUTO_NEXT_DEV;
}
break;
@ -553,7 +621,8 @@ void music_player_err_deal(int err)
msg = KEY_MUSIC_NEXT; // 播放下一曲
break;
}
if (msg != KEY_NULL) {
if (msg != KEY_NULL)
{
app_task_put_key_msg(msg, 0);
}
}
@ -569,7 +638,6 @@ static int music_key_event_opr(struct sys_event *event)
int ret = true;
int err = MUSIC_PLAYER_ERR_NULL;
u8 vol, auto_next_dev;
int mode ;
char *logo = NULL;
int msg[2];
@ -579,15 +647,25 @@ static int music_key_event_opr(struct sys_event *event)
log_i("music task msg = %d\n", msg[0]);
switch (msg[0]) {
/* kt_ui 优先:若消费则不再交给 Music 逻辑(如返回首页等) */
if (kt_key_event_filter_after(msg[0], msg[1]) == true) {
return true;
}
switch (msg[0])
{
case KEY_MUSIC_DEVICE_TONE_END:
#if (MUSIC_DEVICE_TONE_EN)
logo = (char *)msg[1];
log_i("KEY_MUSIC_DEVICE_TONE_END %s\n", logo);
if (logo) {
if (true == breakpoint_vm_read(breakpoint, logo)) {
if (logo)
{
if (true == breakpoint_vm_read(breakpoint, logo))
{
err = music_player_play_by_breakpoint(logo, breakpoint);
} else {
}
else
{
err = music_player_play_first_file(logo);
}
}
@ -598,23 +676,30 @@ static int music_key_event_opr(struct sys_event *event)
app_status_handler(APP_STATUS_MUSIC_PLAY);
/// 断点播放活动设备
logo = dev_manager_get_logo(dev_manager_find_active(1));
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
if (music_player_get_dev_cur() && logo) {
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
if (music_player_get_dev_cur() && logo)
{
/// 播放的设备跟当前活动的设备是同一个设备,不处理
if (0 == strcmp(logo, music_player_get_dev_cur())) {
if (0 == strcmp(logo, music_player_get_dev_cur()))
{
log_w("the same dev!!\n");
break;
}
}
}
#if (MUSIC_DEVICE_TONE_EN)
if (music_device_tone_play(logo) == true) {
if (music_device_tone_play(logo) == true)
{
break;
}
#endif
if (true == breakpoint_vm_read(breakpoint, logo)) {
if (true == breakpoint_vm_read(breakpoint, logo))
{
err = music_player_play_by_breakpoint(logo, breakpoint);
} else {
}
else
{
err = music_player_play_first_file(logo);
}
break;
@ -636,17 +721,22 @@ static int music_key_event_opr(struct sys_event *event)
case KEY_MUSIC_PP:
log_i("KEY_MUSIC_PP\n");
logo = music_player_get_dev_cur();
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
music_set_dev_sync_mode(logo, 0);
} else {
}
else
{
music_set_dev_sync_mode(logo, 1);
}
err = music_player_pp();
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
app_status_handler(APP_STATUS_MUSIC_PLAY);
ui_update_status(STATUS_MUSIC_PLAY);
} else {
}
else
{
app_status_handler(APP_STATUS_MUSIC_PP);
ui_update_status(STATUS_MUSIC_PAUSE);
/* tone_play_by_path(tone_table[IDEX_TONE_MAX_VOL],1); */
@ -688,22 +778,28 @@ static int music_key_event_opr(struct sys_event *event)
auto_next_dev = ((msg[0] == KEY_MUSIC_AUTO_NEXT_DEV) ? 1 : 0);
logo = music_player_get_dev_next(auto_next_dev);
printf("next dev = %s\n", logo);
if (logo == NULL) { ///找不到下一个设备,不响应设备切换
if (logo == NULL)
{ /// 找不到下一个设备,不响应设备切换
break;
}
/// 切换设备前先保存一下上一个设备的断点信息,包括文件和解码信息
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
music_player_stop(0); // 先停止防止下一步操作VM卡顿
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
}
#if (MUSIC_DEVICE_TONE_EN)
if (music_device_tone_play(logo) == true) {
if (music_device_tone_play(logo) == true)
{
break;
}
#endif
if (true == breakpoint_vm_read(breakpoint, logo)) {
if (true == breakpoint_vm_read(breakpoint, logo))
{
err = music_player_play_by_breakpoint(logo, breakpoint);
} else {
}
else
{
err = music_player_play_first_file(logo);
}
break;
@ -711,12 +807,16 @@ static int music_key_event_opr(struct sys_event *event)
log_i("KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH\n");
#if (TCFG_RECORD_FOLDER_DEV_ENABLE)
/// 尝试保存断点
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
}
if (true == breakpoint_vm_read(breakpoint, music_player_get_cur_music_dev())) {
if (true == breakpoint_vm_read(breakpoint, music_player_get_cur_music_dev()))
{
err = music_player_play_record_folder(NULL, breakpoint);
} else {
}
else
{
err = music_player_play_record_folder(NULL, NULL);
}
#endif // TCFG_RECORD_FOLDER_DEV_ENABLE
@ -736,7 +836,6 @@ static int music_key_event_opr(struct sys_event *event)
err = music_player_play_by_path((char *)"udisk0", "/sin.wav"); /// this is a demo
break;
/// 非播放执行类消息
case KEY_MUSIC_FF:
log_i("KEY_MUSIC_FF\n");
@ -749,11 +848,14 @@ static int music_key_event_opr(struct sys_event *event)
music_player_fr(3);
break;
case KEY_MUSIC_CHANGE_REPEAT:
/* 永远单曲循环,不响应切换
log_i("KEY_MUSIC_CHANGE_REPEAT\n");
mode = music_player_change_repeat_mode();
if (mode > 0) {
if (mode > 0)
{
UI_SHOW_MENU(MENU_MUSIC_REPEATMODE, 1000, mode, NULL);
}
*/
break;
case KEY_MUSIC_DELETE_FILE:
log_i("KEY_MUSIC_DELETE_FILE\n");
@ -768,7 +870,6 @@ static int music_key_event_opr(struct sys_event *event)
break;
}
/// 错误处理
music_player_err_deal(err);
/// smartbox info update
@ -778,7 +879,6 @@ static int music_key_event_opr(struct sys_event *event)
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief music 设备事件响应接口
@param
@ -791,29 +891,36 @@ static int music_sys_event_handler(struct sys_event *event)
int err = 0;
char *logo = NULL;
char *evt_logo = NULL;
switch (event->type) {
switch (event->type)
{
case SYS_KEY_EVENT:
return music_key_event_opr(event);
case SYS_DEVICE_EVENT:
switch ((u32)event->arg) {
switch ((u32)event->arg)
{
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
evt_logo = (char *)event->u.dev.value;
case DEVICE_EVENT_FROM_OTG:
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG)
{
evt_logo = (char *)"udisk0";
}
int str_len = 0;
logo = music_player_get_phy_dev(&str_len);
log_i("evt_logo =%s, logo = %s len =%d\n", evt_logo, logo, str_len);
if (event->u.dev.event == DEVICE_EVENT_OUT) {
if (logo == NULL) {
if (event->u.dev.event == DEVICE_EVENT_OUT)
{
if (logo == NULL)
{
break;
}
if (logo && (0 == memcmp(logo, evt_logo, str_len))) {
if (logo && (0 == memcmp(logo, evt_logo, str_len)))
{
/// 相同的设备才响应
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
breakpoint_vm_write(breakpoint, logo);
}
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
@ -823,7 +930,9 @@ static int music_sys_event_handler(struct sys_event *event)
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0); // 卸载了设备再执行
log_i("KEY_MUSIC_PLAYER_START AFTER UMOUNT\n");
}
} else {
}
else
{
#if (MUSIC_DEV_ONLINE_START_AFTER_MOUNT_EN == 0)
music_task_dev_online_start();
#endif
@ -865,7 +974,8 @@ void music_task_set_parm(u8 type, int val)
/*----------------------------------------------------------------------------*/
static void music_player_play_start(void)
{
switch (__this->task_parm.type) {
switch (__this->task_parm.type)
{
case MUSIC_TASK_START_BY_NORMAL:
log_i("MUSIC_TASK_START_BY_NORMAL\n");
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);
@ -881,7 +991,6 @@ static void music_player_play_start(void)
/// 提示音播放失败直接推送KEY_MUSIC_PLAYER_START启动播放
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式新设备上线处理
@param
@ -893,9 +1002,11 @@ void music_task_dev_online_start(void)
{
u8 save = 0;
char *logo = music_player_get_dev_cur();
if (logo && breakpoint) {
if (logo && breakpoint)
{
/// 新设备上线, 先记录当前设备断点, 然后播放活动设备
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
save = 1;
// 这里不要直接记忆断点, 解码停了之后再记忆
// breakpoint_vm_write(breakpoint, logo);
@ -903,7 +1014,8 @@ void music_task_dev_online_start(void)
}
/// 停止解码,播放新活动设备
music_player_stop(1);
if (save && breakpoint) {
if (save && breakpoint)
{
breakpoint_vm_write(breakpoint, logo);
}
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);
@ -922,6 +1034,8 @@ static void music_task_start()
{
printf("music task start!!!!!\n");
music_idle_flag = 0;
/* 永远单曲播放:播完不循环 */
app_var.cycle_mode = FCYCLE_ONE;
ui_update_status(STATUS_MUSIC_MODE);
#if (TCFG_LRC_LYRICS_ENABLE)
@ -937,7 +1051,6 @@ static void music_task_start()
/// 按键使能
sys_key_event_enable();
/// 播放器初始化
struct __player_parm parm = {0};
parm.cb = &music_player_callback;
@ -963,7 +1076,8 @@ static void music_task_close()
UI_HIDE_CURR_WINDOW();
tone_play_stop_by_path(tone_table[IDEX_TONE_MUSIC]); // 停止播放提示音
char *logo = music_player_get_dev_cur();
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
breakpoint_vm_write(breakpoint, logo);
}
@ -987,7 +1101,8 @@ static void music_task_close()
/*----------------------------------------------------------------------------*/
int music_app_check(void)
{
if (dev_manager_get_total(1)) {
if (dev_manager_get_total(1))
{
return true;
}
return false;
@ -1004,39 +1119,43 @@ void app_music_task()
{
int res;
int msg[32];
kt_ui_show_page(KT_PAGE_MUSIC);
music_task_start();
app_task_put_key_msg(KEY_USER_APP_MUSIC_START, 0);
#if (MUSIC_DEVICE_TONE_EN)
music_player_play_start();
#else
#if TCFG_DEC2TWS_ENABLE
extern void set_tws_background_connected_flag(u8 flag);
extern u8 get_tws_background_connected_flag();
if (get_tws_background_connected_flag()) { //不播放提示音
if (get_tws_background_connected_flag())
{ // 不播放提示音
music_player_play_start();
set_tws_background_connected_flag(0);
} else
}
else
#endif
{
tone_play_with_callback_by_name(tone_table[IDEX_TONE_MUSIC], 1, music_tone_play_end_callback, (void *)IDEX_TONE_MUSIC);
}
#endif
while (1) {
while (1)
{
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
switch (msg[0]) {
switch (msg[0])
{
case APP_MSG_SYS_EVENT:
if (music_sys_event_handler((struct sys_event *)(&msg[1])) == false) {
if (music_sys_event_handler((struct sys_event *)(&msg[1])) == false)
{
app_default_event_deal((struct sys_event *)(&msg[1]));
}
break;
default:
break;
}
if (app_task_exitting()) {
if (app_task_exitting())
{
music_task_close();
return;
}
@ -1056,10 +1175,6 @@ REGISTER_LP_TARGET(music_lp_target) = {
void app_music_task()
{
}
#endif

View File

@ -64,7 +64,14 @@ static int power_on_init(void)
#endif
#if TCFG_APP_BT_EN
app_task_switch_to(APP_IDLE_TASK);
if (music_app_check())
{
app_task_switch_to(APP_MUSIC_TASK);
} else {
app_task_switch_to(APP_BT_TASK);
}
//app_task_switch_to(APP_IDLE_TASK);
#else
#if TCFG_USB_APPLE_DOCK_EN //苹果iap协议使用pc模式

View File

@ -1,5 +1,5 @@
#include "kt_ui.h"
#include "ui_home.h"
//#include "ui_home.h"
#include "ui_bt.h"
#include "ui_music.h"
#include "lvgl.h"
@ -91,7 +91,7 @@ void kt_ui_show_page(int page_id)
void kt_ui_post_key_event(int key_event, int key_value)
{
printf("kt_ui_post_key_event: key_event:%d, key_value:%d\n", key_event, key_value);
//printf("kt_ui_post_key_event: key_event:%d, key_value:%d\n", key_event, key_value);
os_taskq_post_msg(KT_TASK_UI_NAME, 3, KT_TASK_CMD_KEY_EVENT, key_event, key_value);
}
@ -104,16 +104,16 @@ void kt_ui_post_update_play_time(tPlayTime *play_time)
static lv_obj_t *scr_home;
static lv_obj_t *scr_bt;
static lv_obj_t *scr_music;
static int current_page_id = KT_PAGE_HOME;
static int current_page_id = KT_PAGE_BT;
static void lv_show_page(int page_id)
{
lv_obj_t *scr = NULL;
switch (page_id)
{
case KT_PAGE_HOME:
scr = scr_home;
break;
//case KT_PAGE_HOME:
// scr = scr_home;
// break;
case KT_PAGE_BT:
scr = scr_bt;
break;
@ -135,16 +135,23 @@ int kt_ui_get_current_page(void)
return current_page_id;
}
u8 kt_ui_music_setting_mode(void)
{
if (current_page_id != KT_PAGE_MUSIC)
return 0;
return ui_music_get_setting_flag();
}
/* 按键分发: 根据当前页面调用对应页面的按键处理 */
static void ui_dispatch_key_event(int key_event, int key_value)
{
//printf("ui_dispatch_key_event: current_page_id:%d, key_event:%d, key_value:%d\n", current_page_id, key_event, key_value);
switch (current_page_id)
{
case KT_PAGE_HOME:
//case KT_PAGE_HOME:
//printf("ui_dispatch_key_event: KT_PAGE_HOME\n");
ui_home_on_key(key_event, key_value);
break;
//ui_home_on_key(key_event, key_value);
// break;
case KT_PAGE_BT:
ui_bt_on_key(key_event, key_value);
break;
@ -158,11 +165,11 @@ static void ui_dispatch_key_event(int key_event, int key_value)
static void lv_ui_init(void)
{
scr_home = ui_home_create();
//scr_home = ui_home_create();
scr_bt = ui_bt_create();
scr_music = ui_music_create();
lv_show_page(KT_PAGE_HOME);
//lv_show_page(KT_PAGE_HOME);
}
void kt_ui_entry(void *priv)
@ -198,9 +205,12 @@ void kt_ui_entry(void *priv)
break;
case KT_TASK_CMD_SHOW_PAGE:
if (msg[2] >= KT_PAGE_HOME && msg[2] <= KT_PAGE_MUSIC)
if (msg[2] >= KT_PAGE_BT && msg[2] <= KT_PAGE_MUSIC)
{
lv_show_page(msg[2]);
if (msg[2] == KT_PAGE_MUSIC) {
ui_music_refresh_file_list();
}
}
lv_task_handler();
break;
@ -216,6 +226,10 @@ void kt_ui_entry(void *priv)
{
ui_bt_update_play_time();
}
else if (current_page_id == KT_PAGE_MUSIC)
{
ui_music_update_play_time();
}
lv_task_handler();
break;

View File

@ -14,4 +14,7 @@ void kt_ui_post_key_event(int key_event, int key_value);
/* 获取当前显示的页面 ID */
int kt_ui_get_current_page(void);
/* Music 页是否处于设置模式用于按键过滤NEXT/PREV 在设置模式下转发给 UI */
u8 kt_ui_music_setting_mode(void);
#endif

View File

@ -71,7 +71,7 @@ lv_obj_t *ui_bt_create(void)
lv_label_set_text(label_bt_name, (name && name[0]) ? name : "---");
}
lv_obj_set_style_text_color(label_bt_name, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(label_bt_name, &lv_font_montserrat_16, 0);
lv_obj_set_style_text_font(label_bt_name, &lv_font_montserrat_12, 0);
lv_obj_set_width(label_bt_name, LCD_W);
lv_obj_set_style_text_align(label_bt_name, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_center(label_bt_name);
@ -92,14 +92,14 @@ lv_obj_t *ui_bt_create(void)
label_curr_time = lv_label_create(scr);
lv_label_set_text(label_curr_time, "0:00");
lv_obj_set_style_text_color(label_curr_time, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(label_curr_time, &lv_font_montserrat_16, 0);
lv_obj_set_style_text_font(label_curr_time, &lv_font_montserrat_12, 0);
lv_obj_set_pos(label_curr_time, BAR_X, TIME_Y);
label_total_time = lv_label_create(scr);
lv_label_set_text(label_total_time, "0:00");
lv_obj_set_style_text_color(label_total_time, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(label_total_time, &lv_font_montserrat_16, 0);
lv_obj_set_pos(label_total_time, BAR_X + BAR_W - 48, TIME_Y);
lv_obj_set_style_text_font(label_total_time, &lv_font_montserrat_12, 0);
lv_obj_set_pos(label_total_time, BAR_X + BAR_W - 30, TIME_Y);
ui_bt_refresh_play_time();
@ -111,10 +111,10 @@ void ui_bt_on_key(int key_event, int key_value)
(void)key_value;
switch (key_event)
{
case KEY_MUSIC_PREV:
/* case KEY_MUSIC_PREV:
case KEY_USER_PREV:
kt_ui_show_page(KT_PAGE_HOME);
break;
break; */
case KEY_USER_PLAY_TIME_UPDATE:
ui_bt_refresh_play_time();
break;

View File

@ -54,6 +54,7 @@ static lv_obj_t *lv_create_color_block(lv_obj_t *parent, int x, int y, int w, in
lv_obj_t *label = lv_label_create(obj);
lv_label_set_text(label, text);
lv_obj_set_style_text_font(label, &lv_font_montserrat_12, 0);
lv_obj_set_style_text_color(label, lv_color_hex(0xFFFFFF), 0);
lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -8);
return obj;
@ -112,7 +113,7 @@ void ui_home_on_key(int key_event, int key_value)
select_block_index = (select_block_index < 1) ? (select_block_index + 1) : 1;
ui_home_refresh_select();
break;
case KEY_USER_APP_BT_START:
/* case KEY_USER_APP_BT_START:
printf("ui_home_on_key: KEY_USER_APP_BT_START\n");
//app_task_switch_to(APP_BT_TASK);
kt_ui_show_page(KT_PAGE_BT);
@ -121,7 +122,7 @@ void ui_home_on_key(int key_event, int key_value)
printf("ui_home_on_key: KEY_USER_APP_MUSIC_START\n");
//app_task_switch_to(APP_MUSIC_TASK);
kt_ui_show_page(KT_PAGE_MUSIC);
break;
break; */
case KEY_USER_ENTER:
printf("ui_home_on_key: KEY_USER_ENTER\n");
if (select_block_index == 0)

View File

@ -5,6 +5,538 @@
#include "key_event_deal.h"
#include "lvgl.h"
#include "drv_st7789.h"
#include "system/fs/fs.h"
#include "dev_manager/dev_manager.h"
#include "system/app_msg.h"
#include "app_config.h"
#include "music_player.h"
#include "eye_led.h"
#define MUSIC_SCAN_PARAM "-tMP1MP2MP3 -sn -r"
#define FILE_NAME_BUF_SIZE 128
#define SHORT_NAME_LEN 13 /* 8.3 + null */
#define LED_MODE_COUNT 8
#define LIST_TOP 36
#define LIST_ROWS 6
#define ROW_GAP 1
#define LIST_AVAIL_H (LCD_H - 50 - LIST_TOP) /* BAR_Y - LIST_TOP = 154 */
#define ROW_H ((LIST_AVAIL_H - (LIST_ROWS - 1) * ROW_GAP) / LIST_ROWS) /* 每行约 24px保证6行容纳 */
#define LIST_H (LIST_ROWS * ROW_H + (LIST_ROWS - 1) * ROW_GAP)
#define LIST_W ((LCD_W - 16) / 2 - 4) /* 左右各一半,中间留缝 */
#define BAR_W (LCD_W - 48)
#define BAR_X 24
#define BAR_H 14
#define BAR_Y (LCD_H - 45)
#define TIME_Y (BAR_Y + BAR_H + 7)
static lv_obj_t *file_list = NULL;
static lv_obj_t *bar_progress = NULL;
static lv_obj_t *label_curr_time = NULL;
static lv_obj_t *label_total_time = NULL;
static lv_obj_t *led_list = NULL;
static struct vfscan *file_scan_fs = NULL;
#if defined(TCFG_LFN_EN) && TCFG_LFN_EN
static u8 lfn_buf[512];
#endif
/* 设置模式:长按 PP 进入;先选 list红框再 ENTER 进入行选择 */
static u8 setting_flag = 0;
#define FOCUS_LIST_FILE 0
#define FOCUS_LIST_LED 1
#define ROW_SELECT_LIST 0 /* 选择列表(红框) */
#define ROW_SELECT_ROW 1 /* 选择行(行内循环) */
static u8 row_select_mode = ROW_SELECT_LIST; /* 0=list 选择1=行选择 */
static u8 focus_list_id = FOCUS_LIST_FILE; /* 当前选中的列表 */
static int focus_idx = 0; /* 行选择时当前列表内的索引 */
void ui_music_update_led_mode_item(u8 mode);
static int get_file_count(void)
{
int n = 0;
if (file_list)
{
uint32_t cnt = lv_obj_get_child_cnt(file_list);
for (uint32_t i = 0; i < cnt; i++)
{
lv_obj_t *c = lv_obj_get_child(file_list, i);
if (lv_obj_get_user_data(c) != NULL)
n++;
}
}
return n;
}
static void clear_focus_style(lv_obj_t *btn)
{
lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, 0);
}
static void set_focus_style(lv_obj_t *btn)
{
lv_obj_set_style_bg_opa(btn, LV_OPA_COVER, 0);
lv_obj_set_style_bg_color(btn, lv_color_hex(0x333333), 0); /* 反显:深色底 */
lv_obj_scroll_to_view(btn, LV_ANIM_OFF); /* 滚动到可见 */
}
#define BORDER_NORMAL 0xCCCCCC
#define BORDER_SELECT 0xFF0000
/* 更新 list 外框颜色list 选择模式下,选中项红框 */
static void update_list_border_style(void)
{
if (!file_list || !led_list)
return;
lv_color_t file_c = (row_select_mode == ROW_SELECT_LIST && focus_list_id == FOCUS_LIST_FILE)
? lv_color_hex(BORDER_SELECT) : lv_color_hex(BORDER_NORMAL);
lv_color_t led_c = (row_select_mode == ROW_SELECT_LIST && focus_list_id == FOCUS_LIST_LED)
? lv_color_hex(BORDER_SELECT) : lv_color_hex(BORDER_NORMAL);
lv_obj_set_style_border_color(file_list, file_c, 0);
lv_obj_set_style_border_color(led_list, led_c, 0);
}
/* 根据 focus_list_id + focus_idx 更新焦点样式(行选择模式才显示行焦点) */
static void update_focus_style(void)
{
update_list_border_style();
if (row_select_mode != ROW_SELECT_ROW)
{
/* list 选择模式:清除所有行焦点 */
if (file_list)
{
uint32_t cnt = lv_obj_get_child_cnt(file_list);
for (uint32_t i = 0; i < cnt; i++)
clear_focus_style(lv_obj_get_child(file_list, i));
}
if (led_list)
{
for (int i = 0; i < LED_MODE_COUNT; i++)
{
lv_obj_t *c = lv_obj_get_child(led_list, i);
if (c)
clear_focus_style(c);
}
}
return;
}
/* 行选择模式:修正 focus_idx标亮当前行 */
int file_cnt = get_file_count();
if (focus_list_id == FOCUS_LIST_FILE)
{
if (file_cnt > 0 && focus_idx >= file_cnt)
focus_idx = 0;
}
else
{
if (focus_idx >= LED_MODE_COUNT)
focus_idx = 0;
}
int file_i = 0;
if (file_list)
{
uint32_t cnt = lv_obj_get_child_cnt(file_list);
for (uint32_t i = 0; i < cnt; i++)
{
lv_obj_t *c = lv_obj_get_child(file_list, i);
if (lv_obj_get_user_data(c) != NULL)
{
if (focus_list_id == FOCUS_LIST_FILE && focus_idx == file_i)
set_focus_style(c);
else
clear_focus_style(c);
file_i++;
}
}
}
if (led_list)
{
for (int i = 0; i < LED_MODE_COUNT; i++)
{
lv_obj_t *c = lv_obj_get_child(led_list, i);
if (c)
{
if (focus_list_id == FOCUS_LIST_LED && focus_idx == i)
set_focus_style(c);
else
clear_focus_style(c);
}
}
}
}
/* NEXT/PREV: list 选择模式下切换 list行选择模式下仅在当前 list 内循环 */
static void focus_next(void)
{
if (row_select_mode == ROW_SELECT_LIST)
{
focus_list_id = (focus_list_id == FOCUS_LIST_FILE) ? FOCUS_LIST_LED : FOCUS_LIST_FILE;
}
else
{
if (focus_list_id == FOCUS_LIST_FILE)
{
int n = get_file_count();
if (n <= 0)
return;
focus_idx = (focus_idx + 1) % n;
}
else
focus_idx = (focus_idx + 1) % LED_MODE_COUNT;
}
update_focus_style();
}
static void focus_prev(void)
{
if (row_select_mode == ROW_SELECT_LIST)
{
focus_list_id = (focus_list_id == FOCUS_LIST_FILE) ? FOCUS_LIST_LED : FOCUS_LIST_FILE;
}
else
{
if (focus_list_id == FOCUS_LIST_FILE)
{
int n = get_file_count();
if (n <= 0)
return;
focus_idx = (focus_idx - 1 + n) % n;
}
else
focus_idx = (focus_idx - 1 + LED_MODE_COUNT) % LED_MODE_COUNT;
}
update_focus_style();
}
static void focus_exit_setting(void);
/* 确认键list 选择时进入行选择;行选择时确认并退出设置 */
static void focus_confirm(void)
{
if (row_select_mode == ROW_SELECT_LIST)
{
row_select_mode = ROW_SELECT_ROW;
focus_idx = 0;
if (focus_list_id == FOCUS_LIST_FILE)
{
int n = get_file_count();
if (n <= 0)
row_select_mode = ROW_SELECT_LIST; /* 空列表不进入 */
}
}
else
{
/* 行选择确认file 播放选中曲目LED 仅退出 */
if (focus_list_id == FOCUS_LIST_FILE)
{
int file_i = 0;
uint32_t cnt = file_list ? lv_obj_get_child_cnt(file_list) : 0;
for (uint32_t i = 0; i < cnt; i++)
{
lv_obj_t *c = lv_obj_get_child(file_list, i);
if (lv_obj_get_user_data(c) != NULL)
{
if (file_i == focus_idx)
{
u32 sclust = (u32)(uintptr_t)lv_obj_get_user_data(c);
app_task_put_key_msg(KEY_MUSIC_PLAYE_BY_DEV_SCLUST, (int)sclust);
break;
}
file_i++;
}
}
}
else
{
eye_led_stop();
eye_led_set_mode((u8)(focus_idx + 1));
eye_led_start();
ui_music_update_led_mode_item((u8)(focus_idx + 1));
}
setting_flag = 0;
focus_exit_setting();
return;
}
update_focus_style();
}
static void focus_enter_setting(void)
{
row_select_mode = ROW_SELECT_LIST;
focus_list_id = FOCUS_LIST_FILE; /* 默认选中 file_list */
focus_idx = 0;
int file_cnt = get_file_count();
if (file_cnt <= 0)
focus_list_id = FOCUS_LIST_LED;
update_focus_style();
}
static void focus_exit_setting(void)
{
row_select_mode = ROW_SELECT_LIST;
if (file_list)
lv_obj_set_style_border_color(file_list, lv_color_hex(BORDER_NORMAL), 0);
if (led_list)
lv_obj_set_style_border_color(led_list, lv_color_hex(BORDER_NORMAL), 0);
if (file_list)
{
uint32_t cnt = lv_obj_get_child_cnt(file_list);
for (uint32_t i = 0; i < cnt; i++)
clear_focus_style(lv_obj_get_child(file_list, i));
}
if (led_list)
{
for (int i = 0; i < LED_MODE_COUNT; i++)
{
lv_obj_t *c = lv_obj_get_child(led_list, i);
if (c)
clear_focus_style(c);
}
}
}
static void file_btn_click_cb(lv_event_t *e)
{
lv_obj_t *btn = lv_event_get_target(e);
u32 sclust = (u32)(uintptr_t)lv_obj_get_user_data(btn);
app_task_put_key_msg(KEY_MUSIC_PLAYE_BY_DEV_SCLUST, (int)sclust);
}
static void refresh_file_list_content(lv_obj_t *list)
{
if (!list)
return;
lv_obj_t *child;
while ((child = lv_obj_get_child(list, 0)) != NULL)
{
lv_obj_del(child);
}
void *dev = dev_manager_find_active(1);
if (!dev)
{
lv_list_add_text(list, "No storage device");
return;
}
char *path = dev_manager_get_root_path(dev);
if (!path)
{
lv_list_add_text(list, "No storage device");
return;
}
if (file_scan_fs)
{
fscan_release(file_scan_fs);
file_scan_fs = NULL;
}
file_scan_fs = fscan(path, MUSIC_SCAN_PARAM, 9);
#if defined(TCFG_LFN_EN) && TCFG_LFN_EN
if (file_scan_fs)
{
fset_lfn_buf(file_scan_fs, lfn_buf);
}
#endif
if (!file_scan_fs || file_scan_fs->file_number == 0)
{
lv_list_add_text(list, "No music files");
return;
}
u8 *name_buf = (u8 *)lv_mem_alloc(FILE_NAME_BUF_SIZE);
if (!name_buf)
{
lv_list_add_text(list, "Out of memory");
return;
}
int add_cnt = 0;
for (u32 i = 0; i < file_scan_fs->file_number; i++)
{
FILE *f = fselect(file_scan_fs, FSEL_BY_NUMBER, i + 1);
if (!f)
continue;
struct vfs_attr attr;
fget_attrs(f, &attr);
if (attr.attr & F_ATTR_DIR)
{
fclose(f);
continue;
}
int len = fget_name(f, name_buf, SHORT_NAME_LEN);
fclose(f);
if (len <= 0)
continue;
if (len >= SHORT_NAME_LEN)
len = SHORT_NAME_LEN - 1;
name_buf[len] = '\0';
int need_fallback = 0;
if (len >= 2 && name_buf[0] == '\\' && name_buf[1] == 'U')
{
need_fallback = 1;
}
else
{
for (int j = 0; j < len; j++)
{
if ((u8)name_buf[j] < 0x20 || (u8)name_buf[j] > 0x7E)
{
need_fallback = 1;
break;
}
}
}
const char *disp_text;
char fallback[16];
if (need_fallback)
{
int n = add_cnt + 1;
memcpy(fallback, "Music ", 6);
if (n >= 10)
{
fallback[6] = '0' + n / 10;
fallback[7] = '0' + n % 10;
fallback[8] = '\0';
}
else
{
fallback[6] = '0' + n;
fallback[7] = '\0';
}
disp_text = fallback;
}
else
{
disp_text = (const char *)name_buf;
}
lv_obj_t *btn = lv_list_add_btn(list, LV_SYMBOL_AUDIO, disp_text);
lv_obj_set_height(btn, ROW_H);
lv_obj_set_style_pad_all(btn, 2, 0); /* 压缩按钮内边距适配12号字体 */
lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, 0); /* 行背景透明 */
lv_obj_set_style_text_color(btn, lv_color_hex(0xFFFFFF), 0); /* 白色文字,需设在按钮上才生效 */
lv_obj_set_style_border_width(btn, 1, 0);
lv_obj_set_style_border_side(btn, LV_BORDER_SIDE_BOTTOM, 0);
lv_obj_set_style_border_color(btn, lv_color_hex(0xAAAAAA), 0); /* 浅色行分隔线 */
lv_obj_set_user_data(btn, (void *)(uintptr_t)attr.sclust);
lv_obj_add_event_cb(btn, file_btn_click_cb, LV_EVENT_CLICKED, NULL);
add_cnt++;
}
lv_mem_free(name_buf);
}
static void create_led_mode_list(lv_obj_t *list)
{
const char *mode_text[] = {"Mode 1", "Mode 2", "Mode 3", "Mode 4", "Mode 5", "Mode 6", "Mode 7", "Mode 8"};
for (int i = 0; i < LED_MODE_COUNT; i++)
{
lv_obj_t *btn = lv_list_add_btn(list, LV_SYMBOL_CHARGE, mode_text[i]);
lv_obj_set_height(btn, ROW_H);
lv_obj_set_style_pad_all(btn, 2, 0); /* 压缩按钮内边距适配12号字体 */
lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, 0); /* 行背景透明 */
lv_obj_set_style_text_color(btn, lv_color_hex(0xFFFFFF), 0); /* 白色文字,需设在按钮上才生效 */
lv_obj_set_style_border_width(btn, 1, 0);
lv_obj_set_style_border_side(btn, LV_BORDER_SIDE_BOTTOM, 0);
lv_obj_set_style_border_color(btn, lv_color_hex(0xAAAAAA), 0); /* 浅色行分隔线 */
}
}
void ui_music_update_playing_item(u32 sclust);
void ui_music_refresh_file_list(void)
{
if (file_list)
{
refresh_file_list_content(file_list);
/* 若正在播放,恢复高亮对应列表项 */
if (music_player_get_play_status() == 1) /* FILE_DEC_STATUS_PLAY */
ui_music_update_playing_item(music_player_get_file_sclust());
}
/* 若 eye LED 正在运行,恢复高亮对应模式 */
ui_music_update_led_mode_item(eye_led_get_mode());
}
/* 刷新播放进度music_player 返回秒,与 file_dec_get_cur_time 一致) */
static void ui_music_refresh_play_time(void)
{
if (!bar_progress || !label_curr_time || !label_total_time)
return;
int cur_sec = music_player_get_dec_cur_time();
int total_sec = music_player_get_dec_total_time();
u32 cur_min = (u32)(cur_sec / 60);
u32 cur_s = (u32)(cur_sec % 60);
u32 total_min = (u32)(total_sec / 60);
u32 total_s = (u32)(total_sec % 60);
char buf[16];
lv_snprintf(buf, sizeof(buf), "%" LV_PRIu32 ":%02" LV_PRIu32, cur_min, cur_s);
lv_label_set_text(label_curr_time, buf);
lv_snprintf(buf, sizeof(buf), "%" LV_PRIu32 ":%02" LV_PRIu32, total_min, total_s);
lv_label_set_text(label_total_time, buf);
int val = (total_sec > 0) ? (int)((u32)cur_sec * 100 / (u32)total_sec) : 0;
if (val > 100)
val = 100;
lv_bar_set_value(bar_progress, val, LV_ANIM_OFF);
}
void ui_music_update_play_time(void)
{
ui_music_refresh_play_time();
}
#define COLOR_PLAYING 0x00FF00 /* 正在播放:绿色 */
#define COLOR_NORMAL 0xFFFFFF /* 普通:白色 */
/* 根据当前 eye LED 模式高亮对应列表项绿色mode 0 表示全部恢复白色 */
void ui_music_update_led_mode_item(u8 mode)
{
if (!led_list)
return;
for (int i = 0; i < LED_MODE_COUNT; i++)
{
lv_obj_t *c = lv_obj_get_child(led_list, i);
if (c)
{
lv_color_t color = (mode != 0 && (int)(mode - 1) == i)
? lv_color_hex(COLOR_PLAYING) : lv_color_hex(COLOR_NORMAL);
lv_obj_set_style_text_color(c, color, 0);
}
}
}
/* 根据播放文件的 sclust 高亮对应列表项(绿色) */
void ui_music_update_playing_item(u32 sclust)
{
if (!file_list)
return;
uint32_t cnt = lv_obj_get_child_cnt(file_list);
for (uint32_t i = 0; i < cnt; i++)
{
lv_obj_t *c = lv_obj_get_child(file_list, i);
void *ud = lv_obj_get_user_data(c);
if (ud != NULL)
{
u32 item_sclust = (u32)(uintptr_t)ud;
lv_color_t color = (item_sclust == sclust) ? lv_color_hex(COLOR_PLAYING) : lv_color_hex(COLOR_NORMAL);
lv_obj_set_style_text_color(c, color, 0);
}
}
}
lv_obj_t *ui_music_create(void)
{
@ -15,32 +547,113 @@ lv_obj_t *ui_music_create(void)
/* 顶部标题 */
lv_obj_t *title = lv_label_create(scr);
lv_label_set_text(title, "Music Mode");
lv_label_set_text(title, "Music");
lv_obj_set_style_text_font(title, &lv_font_montserrat_20, 0);
lv_obj_set_style_text_color(title, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_pos(title, 0, 8);
lv_obj_set_width(title, LCD_W);
lv_obj_set_style_text_align(title, LV_TEXT_ALIGN_CENTER, 0);
/* 居中内容 */
lv_obj_t *label = lv_label_create(scr);
lv_label_set_text(label, "Music");
lv_obj_set_style_text_color(label, lv_color_hex(0xFFFFFF), 0);
lv_obj_center(label);
/* 左侧:文件列表 */
file_list = lv_list_create(scr);
lv_obj_set_size(file_list, LIST_W, LIST_H);
lv_obj_set_pos(file_list, 4, LIST_TOP);
lv_obj_set_style_bg_opa(file_list, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_width(file_list, 1, 0);
lv_obj_set_style_border_color(file_list, lv_color_hex(0xCCCCCC), 0); /* 浅色边框 */
lv_obj_set_style_text_color(file_list, lv_color_hex(0xFFFFFF), 0); /* 白色前景 */
lv_obj_set_style_text_font(file_list, &lv_font_montserrat_12, 0);
lv_obj_set_style_pad_row(file_list, ROW_GAP, 0);
refresh_file_list_content(file_list);
/* 右侧LED 模式列表 */
led_list = lv_list_create(scr);
lv_obj_set_size(led_list, LIST_W, LIST_H);
lv_obj_set_pos(led_list, 12 + LIST_W, LIST_TOP);
lv_obj_set_style_bg_opa(led_list, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_width(led_list, 1, 0);
lv_obj_set_style_border_color(led_list, lv_color_hex(0xCCCCCC), 0); /* 浅色边框 */
lv_obj_set_style_text_color(led_list, lv_color_hex(0xFFFFFF), 0); /* 白色前景 */
lv_obj_set_style_text_font(led_list, &lv_font_montserrat_12, 0);
lv_obj_set_style_pad_row(led_list, ROW_GAP, 0);
create_led_mode_list(led_list);
/* 底部进度条(同 BT 页) */
bar_progress = lv_bar_create(scr);
lv_obj_set_size(bar_progress, BAR_W, BAR_H);
lv_obj_set_pos(bar_progress, BAR_X, BAR_Y);
lv_bar_set_range(bar_progress, 0, 100);
lv_bar_set_value(bar_progress, 0, LV_ANIM_OFF);
lv_obj_set_style_bg_color(bar_progress, lv_color_hex(0xAAAAAA), LV_PART_MAIN);
lv_obj_set_style_bg_opa(bar_progress, LV_OPA_70, LV_PART_MAIN);
lv_obj_set_style_bg_color(bar_progress, lv_color_hex(0x2196F3), LV_PART_INDICATOR);
lv_obj_set_style_radius(bar_progress, 7, 0);
lv_obj_set_style_radius(bar_progress, 7, LV_PART_INDICATOR);
label_curr_time = lv_label_create(scr);
lv_label_set_text(label_curr_time, "0:00");
lv_obj_set_style_text_color(label_curr_time, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(label_curr_time, &lv_font_montserrat_12, 0);
lv_obj_set_pos(label_curr_time, BAR_X, TIME_Y);
label_total_time = lv_label_create(scr);
lv_label_set_text(label_total_time, "0:00");
lv_obj_set_style_text_color(label_total_time, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(label_total_time, &lv_font_montserrat_12, 0);
lv_obj_set_pos(label_total_time, BAR_X + BAR_W - 30, TIME_Y);
ui_music_refresh_play_time();
return scr;
}
void ui_music_on_key(int key_event, int key_value)
{
(void)key_value;
switch (key_event)
{
case KEY_MUSIC_PREV:
case KEY_USER_PREV:
kt_ui_show_page(KT_PAGE_HOME);
//case KEY_USER_PREV:
if (setting_flag)
focus_prev();
break;
case KEY_MUSIC_NEXT:
//case KEY_USER_NEXT:
if (setting_flag)
focus_next();
break;
//case KEY_USER_ENTER:
case KEY_MUSIC_PP: /* 设置模式下 PP 单击 = 确认 */
if (setting_flag)
{
focus_confirm(); /* 确认:音乐列表 <-> LED 列表切换焦点 */
}
break;
case KEY_USER_PLAY_TIME_UPDATE:
ui_music_refresh_play_time();
break;
case KEY_USER_MUSIC_PLAYING:
ui_music_update_playing_item((u32)key_value);
break;
case KEY_USER_EYE_LED_STOP:
ui_music_update_led_mode_item(0);
break;
case KEY_USER_SETTING:
setting_flag = !setting_flag;
if (setting_flag)
{
focus_enter_setting(); /* 进入设置,默认焦点到文件列表第一项 */
}
else
{
focus_exit_setting();
}
break;
default:
break;
}
}
u8 ui_music_get_setting_flag(void)
{
return setting_flag;
}

View File

@ -1,9 +1,13 @@
#ifndef __UI_MUSIC_H__
#define __UI_MUSIC_H__
#include "typedef.h"
#include "lvgl.h"
lv_obj_t *ui_music_create(void);
void ui_music_on_key(int key_event, int key_value);
void ui_music_refresh_file_list(void);
void ui_music_update_play_time(void);
u8 ui_music_get_setting_flag(void); /* 供 kt_key_event_filter 判断是否转发 NEXT */
#endif

View File

@ -1007,10 +1007,19 @@ REGISTER_LP_TARGET(audio_dec_init_lp_target) = {
#if AUDIO_OUTPUT_AUTOMUTE
#include "kt.h"
void audio_mix_out_automute_mute(u8 mute)
{
printf(">>>>>>>>>>>>>>>>>>>> %s\n", mute ? ("MUTE") : ("UNMUTE"));
if (mute)
{
PA_MUTE();
}
else
{
PA_UNMUTE();
}
}
/* #define AUDIO_E_DET_UNMUTE (0x00) */

View File

@ -5,20 +5,6 @@ fat_vfs_ops
sdfile_vfs_ops
nor_fs_vfs_ops
nor_sdfile_vfs_ops
nor_rec_fs_vfs_ops
fat_sdfile_fat_ops
sbc_decoder
msbc_decoder
sbc_hwaccel
@ -45,23 +31,7 @@ mp3_decoder
wma_decoder
flac_decoder
ape_decoder
m4a_decoder
g729_decoder
wav_decoder
cvsd_encoder

View File

@ -45,7 +45,7 @@
#define SPI0_ENABLE 0 //是否使能SPI0使能后需定义spi0_p_data
#define SPI1_ENABLE 1 //是否使能SPI1使能后需定义spi1_p_data
#define SPI1_ENABLE 0 //是否使能SPI1使能后需定义spi1_p_data
#define SPI2_ENABLE 1 //是否使能SPI2使能后需定义spi2_p_data

Binary file not shown.

View File

@ -0,0 +1 @@
44b10a8a9a97a7ea8795ce48fe8bb180954fc20c5763ded5954fc20c5763ded5399f4f1d

View File

@ -11,15 +11,15 @@ copy ..\..\br23loader.bin .
copy ..\..\eq_cfg_hw.bin .
copy ..\..\ota_all.bin .
copy ..\..\ota_nor.bin .
..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1
..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1 -key KTS-AC69xx_5458.key
:: -format all
::-reboot 2500
@rem 删除临时文件-format all
@rem ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD>-format all
if exist *.mp3 del *.mp3
if exist *.PIX del *.PIX
if exist *.TAB del *.TAB
@ -28,13 +28,13 @@ if exist *.sty del *.sty
@rem 生成固件升级文件
@rem <EFBFBD><EFBFBD><EFBFBD>ɹ̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
copy ota_all.bin ota.bin
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_all.fw
copy ota_nor.bin ota.bin
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_nor.fw
@rem 添加配置脚本的版本信息到 FW 文件中
@rem <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýű<EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD> FW <20>ļ<EFBFBD><C4BC><EFBFBD>
..\..\fw_add.exe -noenc -fw jl_isd_all.fw -add script.ver -out jl_isd_all.fw
..\..\fw_add.exe -noenc -fw jl_isd_nor.fw -add script.ver -out jl_isd_nor.fw
@ -48,16 +48,16 @@ copy jl_isd_all.fw jl_isd.fw
del jl_isd_all.ufw jl_isd_nor.ufw jl_isd_all.fw jl_isd_nor.fw
@REM 生成配置文件升级文件
@REM <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
::ufw_maker.exe -chip AC800X %ADD_KEY% -output config.ufw -res bt_cfg.cfg
::IF EXIST jl_696x.bin del jl_696x.bin
@rem 常用命令说明
@rem -format vm //擦除VM 区域
@rem -format cfg //擦除BT CFG 区域
@rem -format 0x3f0-2 //表示从第 0x3f0 个 sector 开始连续擦除 2 个 sector(第一个参数为16进制或10进制都可第二个参数必须是10进制)
@rem <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>
@rem -format vm //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>VM <20><><EFBFBD><EFBFBD>
@rem -format cfg //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>BT CFG <20><><EFBFBD><EFBFBD>
@rem -format 0x3f0-2 //<EFBFBD><EFBFBD>ʾ<EFBFBD>ӵ<EFBFBD> 0x3f0 <20><> sector <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 <20><> sector(<28><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ16<31><36><EFBFBD>ƻ<EFBFBD>10<31><30><EFBFBD>ƶ<EFBFBD><C6B6>ɣ<EFBFBD><C9A3>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD>)
ping /n 2 127.1>null
IF EXIST null del null

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff