mcu_ab568x/app/platform/bsp/bsp_ble/bsp_ams.c
2025-05-30 18:03:10 +08:00

225 lines
5.9 KiB
C

#include "include.h"
#include "bsp_ams.h"
#define TRACE_EN 0
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
#if (LE_AMS_CLIENT_EN && LE_EN)
enum //实体对象
{
AMS_ENTITY_ID_PLAYER = 0,
AMS_ENTITY_ID_QUEUE,
AMS_ENTITY_ID_TRACK,
};
enum //player对象的属性
{
AMS_PLAYER_ATT_ID_NAME = 0,
AMS_PLAYER_ATT_ID_PLAYBACKINFO,
AMS_PLAYER_ATT_ID_VOLUME,
};
enum //PLAYBACKINFO属性的值
{
AMS_PLAYBACKINFO_VALUE_STA_PAUSED = '0',
AMS_PLAYBACKINFO_VALUE_STA_PLAYING,
AMS_PLAYBACKINFO_VALUE_STA_REWINDING,
AMS_PLAYBACKINFO_VALUE_STA_FFORWARDING,
};
enum //queue对象的属性
{
AMS_QUEUE_ATT_ID_INDEX = 0,
AMS_QUEUE_ATT_ID_COUNT,
AMS_QUEUE_ATT_ID_SHUFFLEMODE,
AMS_QUEUE_ATT_ID_REPEATMODE,
};
enum //track对象的属性
{
AMS_TRACK_ATT_ID_ARTIST = 0,
AMS_TRACK_ATT_ID_ALBUM,
AMS_TRACK_ATT_ID_TITLE,
AMS_TRACK_ATT_ID_DURATION,
};
ble_ams_cb_t ble_ams_cb;
static ble_ams_sta_update_cb_t ble_ams_sta_update_cb = NULL;
void ble_ams_var_init(void)
{
ble_ams_sta_update_cb = 0;
memset(&ble_ams_cb, 0, sizeof(ble_ams_cb));
}
void ble_ams_sta_update_cb_reg(ble_ams_sta_update_cb_t func_cb)
{
if (func_cb) {
ble_ams_sta_update_cb = func_cb;
}
}
void ble_ams_sta_update_cb_unreg(void)
{
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb = NULL;
}
}
//字符串转数字(针对音量), 0.0625为音量步进
static u32 str_to_num(char *str, u32 size)
{
int i;
u32 result = 0;
u32 coef[4] = {1000, 100, 10, 1};
if (size == 2) {
if (str[0] == '0') {
result = 0;
} else if (str[0] == '1') {
result = 10000;
}
} else if (size > 3) {
size = size > 7 ? 7 : size;
for (i = 2; i < size - 1; i++) {
result += (str[i] - '0') * coef[i-2];
}
}
TRACE("[%s, %d] --> %d\n", str, size, result);
return result;
}
void ble_ams_entity_update_callback(uint8_t event_id, uint8_t attribute_id, uint8_t entity_update_flags, uint8_t *value, uint16_t size)
{
TRACE("%s %x %x %x\n", __func__, event_id, attribute_id, entity_update_flags);
TRACE("%s %d\n", value, size);
//app close
if (!strcmp("0,0.0,0.000", (char *)value)) {
event_id = AMS_ENTITY_ID_PLAYER;
attribute_id = AMS_PLAYER_ATT_ID_PLAYBACKINFO;
value[0] = AMS_PLAYBACKINFO_VALUE_STA_PAUSED;
}
switch (event_id) {
case AMS_ENTITY_ID_PLAYER:
switch (attribute_id) {
case AMS_PLAYER_ATT_ID_NAME:
memset(ble_ams_cb.app_name, 0, sizeof(ble_ams_cb.app_name));
memcpy(ble_ams_cb.app_name, value, (size > sizeof(ble_ams_cb.app_name)) ? sizeof(ble_ams_cb.app_name) : size);
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_APP_NAME, (char *)value, size);
}
break;
case AMS_PLAYER_ATT_ID_PLAYBACKINFO:
switch (value[0]) {
case AMS_PLAYBACKINFO_VALUE_STA_PAUSED:
ble_ams_cb.play_state = 0;
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_PAUSE, NULL, 0);
}
break;
case AMS_PLAYBACKINFO_VALUE_STA_PLAYING:
ble_ams_cb.play_state = 1;
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_PLAYING, NULL, 0);
}
break;
case AMS_PLAYBACKINFO_VALUE_STA_REWINDING:
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_REWINDING, NULL, 0);
}
break;
case AMS_PLAYBACKINFO_VALUE_STA_FFORWARDING:
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_FFORWARDING, NULL, 0);
}
break;
default:
break;
}
// value[2:4] PlaybackRate(float)
// value[6:12] ElapsedTime(float)
break;
case AMS_PLAYER_ATT_ID_VOLUME: //float, from 0 to 1, step: 0.0625
{
u32 volume = str_to_num((char *)value, size);
ble_ams_cb.vol = volume / 625;
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_VOLUME, &volume, sizeof(volume));
}
}
break;
default:
break;
}
break;
case AMS_ENTITY_ID_QUEUE:
switch (attribute_id) {
case AMS_QUEUE_ATT_ID_INDEX:
break;
case AMS_QUEUE_ATT_ID_COUNT:
break;
case AMS_QUEUE_ATT_ID_SHUFFLEMODE:
break;
case AMS_QUEUE_ATT_ID_REPEATMODE:
break;
default:
break;
}
break;
case AMS_ENTITY_ID_TRACK:
switch (attribute_id) {
case AMS_TRACK_ATT_ID_ARTIST:
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_ARTIST, (char *)value, size);
}
break;
case AMS_TRACK_ATT_ID_ALBUM:
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_ALBUM, (char *)value, size);
}
break;
case AMS_TRACK_ATT_ID_TITLE:
if (ble_ams_sta_update_cb) {
ble_ams_sta_update_cb(BLE_AMS_STA_UPDATE_TITLE, (char *)value, size);
}
break;
case AMS_TRACK_ATT_ID_DURATION:
break;
default:
break;
}
break;
default:
break;
}
}
#endif // (LE_AMS_CLIENT_EN && LE_EN)