pinebuds/services/resources/resources.cpp

377 lines
14 KiB
C++

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#include "cmsis_os.h"
#include "stdio.h"
#include "string.h"
#include "hal_timer.h"
#include "hal_trace.h"
#include "crc32.h"
#include "resources.h"
#ifdef MEDIA_PLAYER_SUPPORT
typedef struct {
UINT32 MARK;
UINT16 ID; // resource id
UINT16 count; // count of resource
UINT32 total_size; // size include resource header, header list and data
} ResourceHeader_t;
typedef struct {
UINT16 audio_id; // audio id
UINT16 type;
UINT32 size;
UINT32 offset;
} AudioHeader_t;
typedef struct _AUDIO_List {
struct _AUDIO_List *next;
AudioHeader_t record;
} AUDIO_List;
#define AUDIO_TOOL_VERSION 0x6001
#define MAGIC_NUMBER 0xC0BA
#define AUDIO_TOOL_RES_MARK 0xDDCCBBAA
UINT16 gVersionNO = 0;
UINT32 gReserver1 = 0;
UINT32 gReserver2 = 0;
ResourceHeader_t *gpResourceBase =
NULL; // base address of resource data, will be set by boot monitor
AUDIO_List *gpAudioList = NULL;
AUDIO_List *gpAudioList_CN = NULL;
uint8_t *gpAudioDataBase = NULL;
uint8_t *gpAudioDataBase_CN = NULL;
// uint8_t os_pool_audio_List[sizeof(AUDIO_List)*MAX_RECORD_NUM ]
// __attribute__((section(".audioList")));
AUDIO_List os_pool_audio_List
[MAX_RECORD_NUM]; //__attribute__((section(".audioList")));
// osPoolDef_t os_pool_def_audio_List = { MAX_RECORD_NUM, sizeof(AUDIO_List),
// os_pool_audio_List };//osPoolDef(name, no, type) osPoolId AUDIO_ListPool_Id;
AUDIO_List os_pool_audio_List_CN[MAX_RECORD_NUM];
UINT8 *aud_get_reouce(AUD_ID_ENUM id, UINT32 *leng, UINT16 *type) {
AUDIO_List *list = gpAudioList;
*leng = 0, *type = 0;
while (list) {
if (list->record.audio_id == id) {
*leng = list->record.size;
*type = list->record.type;
return (UINT8 *)(gpAudioDataBase + list->record.offset);
}
list = list->next;
}
return 0;
}
UINT8 *aud_get_reouce_chinese(AUD_ID_ENUM id, UINT32 *leng, UINT16 *type) {
AUDIO_List *list = gpAudioList_CN;
*leng = 0, *type = 0;
while (list) {
if (list->record.audio_id == id) {
*leng = list->record.size;
*type = list->record.type;
return (UINT8 *)(gpAudioDataBase_CN + list->record.offset);
}
list = list->next;
}
return 0;
}
/*
--1.Version No&Magic No.<4>
--2.CRC <4>
--3.Reserver1 <4> total length = 5+6+7+...
--4.Reserver2 <4>
--5.ResourceHeader_t <8>
--6.AUDIO_HEAD_LIST X count <16 x count>
--7.file.. gpAudioDataBase.. offset
--.... another resource
*/
void init_audio_resource(void *gResource) {
uint32_t crc;
uint32_t *pcrc;
uint32_t data;
UINT32 res_addr;
ResourceHeader_t *pRes;
data = *((UINT32 *)gResource);
gVersionNO = 0xFFFF & (data >> 16);
gReserver1 = *((UINT32 *)((uint32_t)gResource + 2 * sizeof(UINT32)));
pcrc = (uint32_t *)((uint32_t)gResource + sizeof(UINT32)); /*crc*/
gpResourceBase =
(ResourceHeader_t *)((uint32_t)gResource + 4 * sizeof(uint32_t));
/********************************************************/
crc = crc32(0, (uint8_t *)((uint32_t)gpResourceBase), gReserver1);
TRACE(3, "%s, *pcrc: %x , crc: %x", __func__, *pcrc, crc);
if (*pcrc != crc)
return;
res_addr = (uint32_t)gpResourceBase;
pRes = (ResourceHeader_t *)gpResourceBase;
while ((UINT32)pRes < (UINT32)gpResourceBase + gReserver1 &&
pRes->MARK == AUDIO_TOOL_RES_MARK) {
if (pRes->ID == RES_ENGLISH_ID) {
AUDIO_List *list;
memset(os_pool_audio_List, 0, sizeof(AUDIO_List) * MAX_RECORD_NUM);
memcpy((uint8_t *)os_pool_audio_List,
(uint8_t *)((uint32_t)pRes + sizeof(ResourceHeader_t)),
sizeof(AUDIO_List) * pRes->count);
gpAudioList = (AUDIO_List *)os_pool_audio_List;
list = gpAudioList;
gpAudioDataBase = (uint8_t *)pRes + sizeof(ResourceHeader_t) +
sizeof(AUDIO_List) * pRes->count;
TRACE(3, "%s, english count: %d, leng: %d", __func__, pRes->count,
pRes->total_size);
for (int i = 1; i < pRes->count; i++) {
list->next = &os_pool_audio_List[i];
list = list->next;
}
TRACE(2, "%s, english list: %p", __func__, list);
} else if (pRes->ID == RES_CHINESE_ID) {
AUDIO_List *list;
TRACE(2, "%s, AUDIO_TOOL_RES_MARK: %d", __func__, pRes->count);
memset(os_pool_audio_List_CN, 0, sizeof(AUDIO_List) * MAX_RECORD_NUM);
memcpy((uint8_t *)os_pool_audio_List_CN,
(uint8_t *)((uint32_t)pRes + sizeof(ResourceHeader_t)),
sizeof(AUDIO_List) * pRes->count);
gpAudioList_CN = (AUDIO_List *)os_pool_audio_List_CN;
list = gpAudioList_CN;
gpAudioDataBase_CN = (uint8_t *)pRes + sizeof(ResourceHeader_t) +
sizeof(AUDIO_List) * pRes->count;
TRACE(3, "%s, chinese count: %d, leng: %d", __func__, pRes->count,
pRes->total_size);
for (int i = 1; i < pRes->count; i++) {
list->next = &os_pool_audio_List_CN[i];
list = list->next;
}
}
TRACE(3, "%s, %x, pRes->total_size: %x", __func__, res_addr,
pRes->total_size);
res_addr += pRes->total_size;
pRes = (ResourceHeader_t *)(res_addr);
}
TRACE(2, "%s, pRes add: %p", __func__, pRes);
}
#if 0
UINT8 BIN_FILE[] =
{
0xba,0xc0,0x01,0x60,0x18,0x17,0x81,0x7a,0x90,0x05,0x00,0x00,0x00,0x00,0x00,0x00,
0xaa,0xbb,0xcc,0xdd,0x00,0xff,0x1c,0x00,0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x02,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x05,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x06,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x09,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0a,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0b,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0c,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0d,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0e,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0f,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x11,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x12,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x13,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x14,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x15,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x16,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x17,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x19,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1a,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1b,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x34,0x34,0x34,0x35,
0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,
0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,
0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,
0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,
0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,
0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,
0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,
0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,
0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,
0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,
0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,
0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,
0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,
0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,
0x35,0x35,0x35,0x36,0x36,0x36,0x34,0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0x34,
0x34,0x34,0x35,0x35,0x35,0x36,0x36,0x36,0xaa,0xbb,0xcc,0xdd,0x01,0xff,0x1c,0x00,
0xc8,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
0xf3,0x00,0x00,0x00,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,
0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,
0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,
0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,
0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,
0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,
0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,
0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,
0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,
0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,
0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,
0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,
0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,
0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,
0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,
0x31,0x32,0x32,0x32,0x33,0x33,0x33,0x31,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,
};
void test_resource_load()
{
UINT32 leng;
UINT16 type;
UINT8* data;
init_audio_resource(BIN_FILE);
data = aud_get_reouce(AUD_ID_BT_CALL_REFUSE, &leng, &type);
TRACE(6,"====english_audio, leng = %d, type = %d, data[0] = %x, data[1]= %x, data[2]= %x, data[3]= %x", leng, type, data[0], data[1], data[2], data[3]);
data = aud_get_reouce_chinese(AUD_ID_BT_CLEAR_SUCCESS, &leng, &type);
TRACE(6,"====chinese_audio, leng = %d, type = %d, data[0] = %x, data[1]= %x, data[2]= %x, data[3]= %x", leng,type, data[0], data[1], data[2], data[3]);
};
#endif
#endif
const char *aud_id_str[] = {
"[POWER_ON]",
"[POWER_OFF]",
"[LANGUAGE_SWITCH]",
"[NUM_0]",
"[NUM_1]",
"[NUM_2]",
"[NUM_3]",
"[NUM_4]",
"[NUM_5]",
"[NUM_6]",
"[NUM_7]",
"[NUM_8]",
"[NUM_9]",
"[BT_PAIR_ENABLE]",
"[BT_PAIRING]",
"[BT_PAIRING_SUC]",
"[BT_PAIRING_FAIL]",
"[BT_CALL_REFUSE]",
"[BT_CALL_OVER]",
"[BT_CALL_ANSWER]",
"[BT_CALL_HUNG_UP]",
"[BT_CALL_INCOMING_CALL]",
"[BT_CALL_INCOMING_NUMBER]",
"[BT_CHARGE_PLEASE]",
"[BT_CHARGE_FINISH]",
"[BT_CLEAR_SUCCESS]",
"[BT_CLEAR_FAIL]",
"[BT_CONNECTED]",
"[BT_DIS_CONNECT]",
"[BT_WARNING]",
"[BT_ALEXA_START]",
"[FIND_MY_BUDS]",
"[TILE FIND]",
"[BT_ALEXA_STOP]",
"[BT_GSOUND_MIC_OPEN]",
"[BT_GSOUND_MIC_CLOSE]",
"[BT_GSOUND_NC]",
"[BT_MUTE]",
"[RING_WARNING]",
#ifdef __INTERACTION__
"[BT_FINDME]",
#endif
};
const char *aud_id2str(UINT16 aud_id) {
const char *str = NULL;
if (aud_id >= 0 && aud_id < MAX_RECORD_NUM) {
str = aud_id_str[aud_id];
} else {
str = "[UNKNOWN]";
}
return str;
}