Files
刘可亮 724d6bf65e v1.1.2
2025-01-08 19:12:06 +08:00

1347 lines
33 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "bt_config.h"
#include "bt_os.h"
#include "bt_api.h"
#include "bt_core.h"
#ifdef __cplusplus
extern "C" {
#endif
u8 phone_macaddr_buf[12]={'\0'};//手机蓝牙MAC ADDR
u8 phone_name_buf[24]={'\0'};//手机蓝牙名字
u8 bt_hostname_buf[24]={'\0'};//车机蓝牙名字
u8 bt_pincard_buf[4]={'\0'};//蓝牙配对码
u8 bt_macaddr_buf[12]={'\0'};//车机蓝牙MAC ADDR
u8 bt_callin_buf[64];//手机来电号码
bt_phone_state_t bt_phone_state; //手机通话状态
bt_phone_type_t bt_phone_type; //手机连接类型
bt_connect_flag_t bt_connect_flag = BT_STATE_INIT;
bt_spp_connect_flag_t bt_spp_connect_flag = BT_SPP_STATE_INIT;
bt_ble_connect_flag_t bt_ble_connect_flag = BT_BLE_STATE_INIT;
bt_hid_connect_flag_t bt_hid_connect_flag = BT_HID_STATE_INIT;
bt_time_t bt_time;//蓝牙时间
bt_phonebook_state *bt_phonebook_para = NULL;
bt_ID3_info_t *bt_ID3_info = NULL;
//fmrx
u16 ChtoFreq = 0;//返回节目号对应的频点
bt_fmrx_info_t bt_fmrx_info;//某个节目的信息包括总节目数,当前节目号,以及对应的频点
bt_fmrx_list_t bt_fmrx_list;//节目的频点列表
//蓝牙时间需要蓝牙外挂32.768K晶振
__s32 sys_bt_set_time(u8* time)
{
#if 0
__u8 i;
__msg("date time:");
for(i=0;i<10;i++)
{
printf("%d ",time[i]);
}
printf("\n");
#endif
bt_time.year=time[0];
bt_time.month=time[1];
bt_time.day=time[2];
bt_time.hour=time[3];
bt_time.minute=time[4];
sys_bt_get_time_to_app(&bt_time);
return EPDK_OK;
}
__s32 sys_bt_get_time_to_app(bt_time_t *time)
{
#if RTOS
//以下是把BT获取的时间设置给GUI指示时间
{
tui_time_t tui_time;
tui_time.year = bt_time.year+2000;
tui_time.mon = bt_time.month;
tui_time.mday = bt_time.day;
tui_time.hour = bt_time.hour;
tui_time.min= bt_time.minute;
tui_time.sec= 0;
//printf("set time: year =%d,mday =%d,mday =%d",tui_time.year,tui_time.mon,tui_time.mday);
tui_set_localtime(&tui_time);
}
#endif
return EPDK_OK;
}
//app注意year变换数据类型先减2000
__s32 sys_bt_set_time_to_bt(bt_time_t *time)
{
bt_time.year = time->year;
bt_time.month= time->month;
bt_time.day= time->day;
bt_time.hour= time->hour;
bt_time.minute= time->minute;
printf(" bt year =%d,mon=%d,day=%d,hour=%d,min=%d",bt_time.year,bt_time.month,bt_time.day,bt_time.hour,bt_time.minute);
bt_time_set();
return EPDK_OK;
}
void sys_bt_ctrl_lcd(u8 lcd_ctrl)
{
#if RTOS
if(lcd_ctrl == '0')//关机关屏
{
tui_sys_msg_send(TUI_DSK_MSG_SYS_POWER_OFF, NULL, NULL);
}
else if(lcd_ctrl =='1')//开机开屏
{
tui_sys_msg_send(TUI_DSK_MSG_SYS_POWER_ON, NULL, NULL);
}
#endif
return;
}
void sys_bt_ctrl_light(u8 light_ctrl)
{
#if RTOS
if(light_ctrl=='0')///大灯关
{
//printf("==========big led close=========\n");
system_set_ill_state(ILL_STAT_OFF);
/*
turn_off_red();
turn_off_green();
turn_off_blue();
*/
tui_sys_msg_send(TUI_DSK_MSG_SYS_BIG_LED, NULL, NULL);
}
else if(light_ctrl=='1')///大灯开
{
//printf("===========big led open=========\n");
system_set_ill_state(ILL_STAT_ON);
/*
show_light_state();
*/
//不能直接调用
//dsk_display_set_lcd_brightness(LION_BRIGHT_LEVEL3);
tui_sys_msg_send(TUI_DSK_MSG_SYS_BIG_LED, NULL, NULL);
}
#endif
return;
}
void sys_bt_ctrl_pev(u8 pev_ctrl)
{
#if RTOS
__msg("=====pev:%x====\n",pev_ctrl);
if(pev_ctrl=='1')///pev 1->0 2->1
{
__msg("=================prv enter==============\n");
if(system_get_cur_app()==ID_APP_PEV)
{
return ;
}
tui_sys_msg_send(TUI_DSK_MSG_CAR_PEV_ON, NULL, NULL);
}
else if(pev_ctrl=='0')///exit pev
{
__msg("=================prv exit==============\n");
tui_sys_msg_send(TUI_DSK_MSG_CAR_PEV_OFF, NULL, NULL);
}
#endif
return;
}
__s32 sys_bt_set_phonebook(u8 *phonebook)
{///bt_phonebook_para
__s32 namelen = 0;////名称长度
__s32 numlen = 0;////电话号码长度
__s32 datelen = 0;////日期长度
__u8 type=0;
__s32 numstart_index = 0;
__s32 i=0;
__s32 second_num_index=0;
__s32 second_num_cnt=0;
__s32 second_num_flag=0;
__u8 *ptr=0;
// __msg("phonebook:[%s]\n",system_do_msg);
///取名称长度
namelen=phonebook[1];
numlen=phonebook[2];
datelen=phonebook[3];
type=phonebook[4];
////指向NAME
ptr=&(phonebook[5]);
//__wrn("namelen =%d,numlen=%d,datelen =%d,type=%d",namelen,numlen,datelen,type);
__wrn("ptr =%s",ptr);
switch(type)
{
case 0x0://电话本
{
strncpy(bt_phonebook_para->phonebook_name[bt_phonebook_para->cur_phone_total], ptr, namelen+1);
bt_phonebook_para->phonebook_name[bt_phonebook_para->cur_phone_total][namelen]='\0';
strncpy(bt_phonebook_para->phonebook_number[bt_phonebook_para->cur_phone_total], ptr+namelen, numlen);
//在这里做限制只获取一个号码
// strncpy(bt_phonebook_para->phonebook_number[bt_phonebook_para->cur_phone_total], ptr+namelen, 11);
bt_phonebook_para->phonebook_number[bt_phonebook_para->cur_phone_total][numlen]='\0';
//__wrn("phonebook_name =%s",bt_phonebook_para->phonebook_name[bt_phonebook_para->cur_phone_total]);
//__wrn("phonebook_number =%s",bt_phonebook_para->phonebook_number[bt_phonebook_para->cur_phone_total]);
bt_phonebook_para->cur_phone_total++;
__wrn("cur_phone_total =%d",bt_phonebook_para->cur_phone_total);
if(bt_phonebook_para->cur_phone_total>=999)
bt_phonebook_para->cur_phone_total= 999;
break;
}
case 0x1://打出号码
{
strncpy(bt_phonebook_para->phoneout_name[bt_phonebook_para->cur_phoneout_total], ptr, namelen+1);
bt_phonebook_para->phoneout_name[bt_phonebook_para->cur_phoneout_total][namelen]='\0';
strncpy(bt_phonebook_para->phoneout_number[bt_phonebook_para->cur_phoneout_total], ptr+namelen, numlen);
bt_phonebook_para->phoneout_number[bt_phonebook_para->cur_phoneout_total][numlen]='\0';
//__wrn("phoneout_number =%s",bt_phonebook_para->phoneout_name[bt_phonebook_para->cur_phoneout_total]);
//__wrn("phoneout_number =%s",bt_phonebook_para->phoneout_number[bt_phonebook_para->cur_phoneout_total]);
bt_phonebook_para->cur_phoneout_total++;
break;
}
case 0x2://打进号码
{
strncpy(bt_phonebook_para->phonein_name[bt_phonebook_para->cur_phonein_total], ptr, namelen+1);
bt_phonebook_para->phonein_name[bt_phonebook_para->cur_phonein_total][namelen]='\0';
strncpy(bt_phonebook_para->phonein_number[bt_phonebook_para->cur_phonein_total], ptr+namelen, numlen);
bt_phonebook_para->phonein_number[bt_phonebook_para->cur_phonein_total][numlen]='\0';
//__wrn("phonein_number =%s",bt_phonebook_para->phonein_name[bt_phonebook_para->cur_phonein_total]);
//__wrn("phonein_number =%s",bt_phonebook_para->phonein_number[bt_phonebook_para->cur_phonein_total]);
bt_phonebook_para->cur_phonein_total++;
break;
}
case 0x3://未接号码
{
strncpy(bt_phonebook_para->phonemiss_name[bt_phonebook_para->cur_phonemiss_total], ptr, namelen+1);
bt_phonebook_para->phonemiss_name[bt_phonebook_para->cur_phonemiss_total][namelen]='\0';
strncpy(bt_phonebook_para->phonemiss_number[bt_phonebook_para->cur_phonemiss_total], ptr+namelen, numlen);
bt_phonebook_para->phonemiss_number[bt_phonebook_para->cur_phonemiss_total][numlen]='\0';
//__wrn("phonemiss_number =%s",bt_phonebook_para->phonemiss_name[bt_phonebook_para->cur_phonemiss_total]);
//__wrn("phonemiss_number =%s",bt_phonebook_para->phonemiss_number[bt_phonebook_para->cur_phonemiss_total]);
bt_phonebook_para->cur_phonemiss_total++;
break;
}
case 0xf0: //接收完毕,用户发送标记到GUI显示
{
#if RTOS
tui_sys_msg_send(TUI_USER_MSG_APP_GO_BT_BOOK_SHOW, NULL, NULL);
#endif
break;
}
default:
{
__wrn("not find cmd");
break;
}
}
return 0;
}
//获取来电指示电话号码
__s32 sys_bt_get_phonenum(char *btstring)
{
__s32 i=0;
char *p = &(btstring[2]);
if(system_do_msg[1]!='G')
{
__msg("=====Wrong phone number====\n");
return 0;
}
memset(bt_callin_buf, 0, 64);
for(i=0;i<60;i++,p++)
{
if(*p=='G')
{
__inf("\n==='G'over===\n");
break;
}
bt_callin_buf[i] = *p;////sys_docmd[i+2];
//__inf("=%x=",bt_callin_buf[i]);
}
//__inf("==i:%d==\n",i);
bt_callin_buf[i]='\0';
__msg("======phone number=%s=%d=====\n",bt_callin_buf,strlen(bt_callin_buf));
//__msg("=====Telephone number:%s======\n",bt_callin_buf);
return 0;
}
//清除电话本记录
void sys_bt_clear_phonebook(void)
{
#if 1//test bug died
if(bt_phonebook_para != NULL)
{
//bt_phonebook_para->cur_phone_total=0;
//bt_phonebook_para->cur_phoneout_total=0;
//bt_phonebook_para->cur_phonein_total=0;
//bt_phonebook_para->cur_phonemiss_total=0;
memset(bt_phonebook_para,0,sizeof(bt_phonebook_state));
}
#endif
}
__s32 sys_bt_fm_process(void)
{
switch(system_do_msg[1])
{
case 'A'://返回节目号对应的频点
{
ChtoFreq = (system_do_msg[3]<<8)+system_do_msg[2];
}
break;
case 'I':
{
bt_fmrx_info.ch_cnt = system_do_msg[2];
bt_fmrx_list.ch_cnt =bt_fmrx_info.ch_cnt;
bt_fmrx_info.ch_cur = system_do_msg[3];
bt_fmrx_info.freq = system_do_msg[5]<<8+system_do_msg[4];
}
break;
case 'L':
{
u8 i;
bt_fmrx_list.ch_cnt = system_do_msg[2]; //一般没有64个节目
bt_fmrx_info.ch_cnt = bt_fmrx_list.ch_cnt;
for(i = 0;i<bt_fmrx_list.ch_cnt;i++)
{
//第0个数组值就是第一个节目的频点
bt_fmrx_list.freq[i]=(system_do_msg[4+i*2]<<8)+system_do_msg[3+i*2];
}
}
break;
case 'T':
{
bt_fmrx_info.ch_cnt = system_do_msg[2];
bt_fmrx_list.ch_cnt = bt_fmrx_info.ch_cnt;
}
break;
default:
{
}
break;
}
}
__s32 sys_bt_dosomething(void)
{
__s32 i = 0;
switch(system_do_msg[1])
{
case 'A'://HFP当前状态指示->没连上
{
__msg("=====================BT_STATE_NOTCONNECTE=====================\n");
///系统没连上不管,连上后更新图标
if(bt_connect_flag != BT_STATE_NOTCONNECTE)
{
if(bt_phonebook_para!= NULL)
{
sys_bt_clear_phonebook();
}
bt_connect_flag = BT_STATE_NOTCONNECTE;
bt_phone_state = BT_PHONE_INIT;
bt_audio_set_status(BT_STAT_IDLE);
memset(phone_name_buf,0,24);
#if RTOS
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 1);
#endif
}
//蓝牙断开后需要退到上一个应用的
#if RTOS
if(system_get_bt_need_exit()==1)
{
system_set_bt_need_exit(0);
tui_sys_msg_send(TUI_DSK_MSG_RUN_PREV_AUDIO_APP, NULL, NULL);
}
#endif
}
break;
case 'B'://HFP当前状态指示->连上了。
{
__msg("=====================BT_STATE_CONNECTED=====================\n");
///系统连上不管,连上后更新图标
////draw not connect icon
bt_connect_flag = BT_STATE_CONNECTED;
bt_phone_state = BT_PHONE_INIT;
bt_audio_set_status(BT_STAT_IDLE);
#if RTOS
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 0);
#endif
}
break;
case 'C'://蓝牙PIN码
{
__msg("======================bt PIN=====================\n");
for(i=0;i<24;i++)
{
if(system_do_msg[2+i]==0xff||system_do_msg[2+i]==0x0)
{
bt_pincard_buf[i]=0x0;
__inf("=====over=====");
break;
}
bt_pincard_buf[i]=system_do_msg[2+i];
//__inf("=%x=",bt_pincard_buf[i]);
}
#if RTOS
__msg("======================bt PIN :%s======================\n",bt_pincard_buf);
tui_sys_msg_send(TUI_USER_MSG_APP_GO_BT_SET_PIN, NULL, NULL);
#endif
}
break;
case 'D'://手机正在拔号
{
__msg("======================phone call out====================\n");
if(sys_bt_get_phone_state()==0)//////2016-01-15
{
if(bt_connect_flag!=BT_STATE_CONNECTED)
{
///__msg("=====there was no connection==============\n");
bt_connect_flag = BT_STATE_CONNECTED;
#if RTOS
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 0);
#endif
}
bt_phone_state = BT_PHONE_OUTING;
#if RTOS
tui_sys_msg_send(TUI_DSK_MSG_PHONE_CALLING, NULL, NULL);
#endif
}
else
{
///__msg("===========已是通话状态===========\n");
}
}
break;
case 'E'://电话已挂断
{
__msg("==========The phone has been hung up==========\n");
if(bt_connect_flag!=BT_STATE_CONNECTED)
{
///__msg("=====there was no connection==============\n");
bt_connect_flag = BT_STATE_CONNECTED;
#if RTOS
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 0);
#endif
}
bt_phone_state = BT_PHONE_INIT;
#if RTOS
tui_sys_msg_send(TUI_DSK_MSG_BREAK_CALLING, NULL, NULL);
#endif
}
break;
case 'F'://///////来电指示///无电话号码
{
#if RTOS
__msg("===================Incoming call===================\n");
if(bt_connect_flag!=BT_STATE_CONNECTED)
{
///__msg("=====there was no connection==============\n");
bt_connect_flag = BT_STATE_CONNECTED;
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 0);
}
if(bt_phone_state != BT_PHONE_INING)
{
bt_phone_state = BT_PHONE_INING;
}
__msg("===================================================\n");
if(system_get_lcd_state()==LCD_STAT_OFF)//当前关屏状态
{
__msg("=========bt_audio_to_phone=========\n");
bt_audio_to_phone();
return 0;
}
else
{
if(system_get_cur_app()==ID_APP_PEV)
{
if(get_vol_mute_state() == 1)
{
///__msg("===========unMUTE==========\n");
tui_sys_msg_send(TUI_USER_MSG_APP_SPINNER_GO_VOL_MUTE, NULL, NULL);
dsk_aux_set_volume(dsk_aux_get_volume());
}
///切通道
///__msg("==============切通道============\n");
dsk_aux_select_channel(AUX_AUDIO_CHANNEL);
system_enter_denoise();
///__msg("================倒车来电==============\n");
return 0;
}
else
{
__u8 cur_app= system_get_cur_app();
if(cur_app != ID_APP_BT)
{
///__msg("=========================SYSTEM_MEDIA_SAVE_BREAKPOINT=====================\n");
//1,保存当前应用信息
//2,切换到蓝牙应用
tui_sys_msg_send(TUI_DSK_MSG_SYSTEM_SAVE_BREAKPOINT, 0, NULL);
system_set_bt_need_exit(1);
tui_sys_msg_send(TUI_USER_MSG_APP_GO_BT, 0, NULL);
///__msg("=========================ID_APP_BT CREAT FINISHED=====================\n");
}
else
{
if(bt_connect_flag!=BT_STATE_CONNECTED)
{
///__msg("=====there was no connection==============\n");
bt_connect_flag = BT_STATE_CONNECTED;
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 0);
}
bt_phone_state = BT_PHONE_INING;
tui_sys_msg_send(TUI_DSK_MSG_PHONE_CALLING, NULL, NULL);
}
}
}
#endif
}
break;
case 'G'://{"ID", 4},///////来电指示///来电指示(电话打进)同时取出电话号码
{
#if RTOS
__msg("===================Incoming call indication=======================\n");
if(bt_connect_flag!=BT_STATE_CONNECTED)
{
///__msg("=====there was no connection==============\n");
bt_connect_flag = BT_STATE_CONNECTED;
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 0);
}
if(sys_bt_get_phone_state()==0)
{
bt_phone_state = BT_PHONE_INING;
tui_sys_msg_send(TUI_DSK_MSG_PHONE_CALLING, NULL, NULL);
}
else
{
__msg("========Repeated calls========\n");
bt_phone_state = BT_PHONE_INING;
sys_bt_get_phonenum(system_do_msg);
///__msg("====当前是BT====\n");
tui_sys_msg_send(TUI_DSK_MSG_PHONE_CALLING, NULL, NULL);
}
#endif
}
break;
case 'I'://{"IG", 4},///////电话接起
{
#if RTOS
__msg("=============================The phone has been answered777777======================\n");
if(bt_connect_flag!=BT_STATE_CONNECTED)
{
///__msg("=====there was no connection==============\n");
bt_connect_flag = BT_STATE_CONNECTED;
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 0);
}
bt_connect_flag = BT_STATE_CONNECTED;
/////////////////////////////////////////////////////////////////////////////////
if(bt_phone_state ==BT_PHONE_INING)
{
__msg("==================talking in===================\n");
///bt_phone_incoming();
bt_phone_state = BT_PHONE_TALKINING;
}
else if(bt_phone_state ==BT_PHONE_OUTING)
{
__msg("==================talking out===================\n");
bt_phone_state = BT_PHONE_TALKOUTING;
}
if(system_get_cur_app()== ID_APP_BT)
{
tui_sys_msg_send(TUI_USER_MSG_APP_GO_BT_PHONENUMBER_SHOW, NULL, NULL);
}
#endif
}
break;
case 'K'://正在连接的手机名
{
#if RTOS
__s32 i=0;
__msg("=============================phone bt name======================\n");
for(i=0;i<24;i++)
{
if(system_do_msg[2+i]==0xff||system_do_msg[2+i]==0x0)
{
phone_name_buf[i]=0x0;
__inf("=====over=====");
break;
}
phone_name_buf[i]=system_do_msg[2+i];
//__inf("=%x=",phone_name_buf[i]);
}
__msg("=============================phone bt name:%s======================\n",phone_name_buf);
tui_sys_msg_send(TUI_USER_MSG_APP_GO_BT_SET_BTNAME, NULL, NULL);
#endif
}
break;
case 'M'://{"mb", 4},///////播音乐
{
#if RTOS
__msg("============================play music======================\n");
//////////////////////////////解开机没有图标问题点/////////////////////////
bt_connect_flag = BT_STATE_CONNECTED;
/////////////////////////////////////////////////////////////////////////////////
//bt_phone_music_state = 1;
bt_phone_state = BT_PHONE_INIT;
//bt_mute_flag=0; ///开声音
#endif
}
break;
case 'N'://蓝牙设备名
{
#if RTOS
__msg("=============================host bt name======================\n");
for(i=0;i<24;i++)
{
if(system_do_msg[2+i]==0xff||system_do_msg[2+i]==0x0)
{
bt_hostname_buf[i]=0x0;
__inf("=====over=====");
break;
}
bt_hostname_buf[i]=system_do_msg[2+i];
//__inf("=%x=",bt_hostname_buf[i]);
}
__msg("=============================host bt name:%s======================\n",bt_hostname_buf);
//bt_phone_music_state = 1;
tui_sys_msg_send(TUI_USER_MSG_APP_GO_BT_SET_HOSTNAME, NULL, NULL);
#endif
}
break;
case 'S'://取BT STATE
{
#if RTOS
// BT_STATUS_CONNECTING, /*已连接,没有电话和音乐在活动*///40
//BT_STATUS_TAKEING_PHONE, /*正在电话*/
//BT_STATUS_PLAYING_MUSIC, /*正在音乐*/
__msg("===============the bt state in current:%d===========\n",system_do_msg[2]);
if(system_do_msg[2]==40)//BT_STATUS_CONNECTING
{
if(bt_connect_flag!=BT_STATE_CONNECTED)
{
///__msg("======================之前为没有联上====================\n");
bt_connect_flag = BT_STATE_CONNECTED;
tui_obj_set_hidden(TUI_OBJ(GLOBAL_BAR_GLOBAL_VIEW_IMAGE_BTN_7), 0);
}
}
else if(system_do_msg[2]==41)//BT_STATUS_TAKEING_PHONE
{
///__msg("======================来电指示====================\n");
if(bt_phone_state != BT_PHONE_INING)
{
bt_phone_state=BT_PHONE_INING;
}
///__msg("=============================来电======================\n");
if(system_get_lcd_state()==LCD_STAT_OFF)//当前关屏状态
{
///__msg("==========切到手机上=========\n");
bt_audio_to_phone();
//bt_state=BT_PHONE_INING;
return 0;
}
else
{
if(system_get_cur_app()==ID_APP_PEV)//如果当前是倒车应用
{
if(get_vol_mute_state() == 1)
{
///__msg("============解MUTE==========\n");
tui_sys_msg_send(TUI_USER_MSG_APP_SPINNER_GO_VOL_MUTE, NULL, NULL);
dsk_aux_set_volume(dsk_aux_get_volume());
}
///切通道
///__msg("==============切通道============\n");
dsk_aux_select_channel(AUX_AUDIO_CHANNEL);
system_enter_denoise();
return 0;
}
else
{
__u8 cur_app= system_get_cur_app();
if(cur_app != ID_APP_BT)
{
__msg("=========================SYSTEM_MEDIA_SAVE_BREAKPOINT=====================\n");
//1,保存当前应用信息
//2,切换到蓝牙应用
tui_sys_msg_send(TUI_DSK_MSG_SYSTEM_SAVE_BREAKPOINT, NULL, NULL);
system_set_bt_need_exit(1);
tui_sys_msg_send(TUI_USER_MSG_APP_GO_BT, 0, NULL);
__msg("=========================ID_APP_BT CREAT FINISHED=====================\n");
}
else
{
///__msg("====当前是BT====\n");
bt_phone_state = BT_PHONE_INING;
__msg("=====show phone call in number:%s=====\n",bt_callin_buf);
tui_sys_msg_send(TUI_USER_MSG_APP_GO_BT_PHONENUMBER_SHOW, NULL, NULL);
}
}
}
}
else if(system_do_msg[2]==42)//BT_STATUS_PLAYING_MUSIC
{
bt_connect_flag = BT_STATE_CONNECTED;
bt_phone_state = BT_PHONE_INIT;
}
#endif
}
break;
case 'H'://蓝牙MAC ADDR
{
#if RTOS
__msg("=============================mac addr======================\n");
char addr_buf[12]={0};
char temp_buf[12]={0};
for(i=0;i<24;i++)
{
if(system_do_msg[2+i]==0xff||system_do_msg[2+i]==0x0)
{
addr_buf[i]=0x0;
__inf("=====over=====");
break;
}
addr_buf[i]=system_do_msg[2+i];
if(addr_buf[i]<=0xf)
{
sprintf(temp_buf, "0%x",addr_buf[i]);
strcat(bt_macaddr_buf, temp_buf);
}
else
{
sprintf(temp_buf,"%x",addr_buf[i]);
strcat(bt_macaddr_buf, temp_buf);
}
//__inf("=%x=",addr_buf[i]);
}
lowercase_2_uppercase(&bt_macaddr_buf); //将小写字母部分统一转换成大写
__msg("=============mac addr :%s=========\n",bt_macaddr_buf);
#endif
}
break;
default:
break;
}
return 0;
}
__s32 sys_bt_set_music_info(void)
{
switch(system_do_msg[1])
{
case 'L'://歌词
{
__u8 *ptr=0;
__s32 datalen = 0;////数据长度
//__msg("id3 Title %d",system_do_msg[2]);
memset(bt_ID3_info->title_name, 0, 256);
datalen = system_do_msg[2];
ptr = &(system_do_msg[3]);
strncpy(bt_ID3_info->title_name, ptr, datalen+1);
__msg("title_name =%s",bt_ID3_info->title_name);
}
break;
case 'S'://歌曲Artist
{
__u8 *ptr=0;
__s32 datalen = 0;////数据长度
//__msg("id3 Artist %d",system_do_msg[2]);
memset(bt_ID3_info->artist_name, 0, 256);
datalen = system_do_msg[2];
ptr = &(system_do_msg[3]);
strncpy(bt_ID3_info->artist_name, ptr, datalen+1);
__msg("artist_name =%s",bt_ID3_info->artist_name);
}
break;
case 'A'://歌曲Album
{
__u8 *ptr=0;
__s32 datalen = 0;////数据长度
// __msg("id3 Album %d",system_do_msg[2]);
memset(bt_ID3_info->album_name, 0, 256);
datalen = system_do_msg[2];
ptr = &(system_do_msg[3]);
strncpy(bt_ID3_info->album_name, ptr, datalen+1);
__msg("album_name =%s",bt_ID3_info->album_name);
}
break;
case 'C'://当前播放时间
{
__u16 cur_time = 0;
__u8 tmp_time[16];
__u16 min,sec;
//__msg("id3 cur time [byte=%d][%d%d]",system_do_msg[2],system_do_msg[3],system_do_msg[4]);
memset(bt_ID3_info->cur_time, 0, 32);
cur_time = (system_do_msg[3] << 8) | system_do_msg[4];
//__msg("cur_time =%d",cur_time);
min = cur_time/60;
sec = cur_time%60;
__msg("cur_min = %d,cur_sec= %d",min,sec);
if(min > 9)
{
sprintf(bt_ID3_info->cur_time,"%d",min);
}
else
{
sprintf(bt_ID3_info->cur_time,"%d%d",0,min);
}
strcat(bt_ID3_info->cur_time,":");
if(sec > 9)
{
sprintf(tmp_time,"%d",sec);
}
else
{
sprintf(tmp_time,"%d%d",0,sec);
}
strcat(bt_ID3_info->cur_time,tmp_time);
// sprintf(bt_ID3_info->cur_time,"%d/%d",min,sec);
}
break;
case 'T'://总播放时间
{
__u16 total_time = 0;
__u8 tmp_time[16];
__u16 min,sec;
// __msg("id3 total time [byte=%d][%d%d]",system_do_msg[2],system_do_msg[3],system_do_msg[4]);
memset(bt_ID3_info->total_time, 0, 32);
total_time = (system_do_msg[3] << 8) | system_do_msg[4];
// __msg("total_time =%d",total_time);
min = total_time/60;
sec = total_time%60;
__msg("total_min =%d,total_sec =%d",min,sec);
if(min > 9)
{
sprintf(bt_ID3_info->total_time,"%d",min);
}
else
{
sprintf(bt_ID3_info->total_time,"%d%d",0,min);
}
strcat(bt_ID3_info->total_time,":");
if(sec > 9)
{
sprintf(tmp_time,"%d",sec);
}
else
{
sprintf(tmp_time,"%d%d",0,sec);
}
strcat(bt_ID3_info->total_time,tmp_time);
//sprintf(bt_ID3_info->total_time,"%d/%d",min,sec);
}
break;
default:
__msg("id3 info err!");
break;
}
return 0;
}
//蓝牙返回的音乐播放状态
void sys_bt_set_music_status(u8 music_status)
{
__msg("=====bt music status:%x====\n",music_status);
if(music_status=='A')///stop
{
__msg("=================bt music stop==============\n");
bt_audio_set_status(BT_STAT_PAUSE);
}
else if(music_status=='B')///play
{
__msg("=================bt music play==============\n");
bt_audio_set_status(BT_STAT_PLAY);
}
return;
}
__s32 sys_bt_get_phone_state(void)
{
if(bt_phone_state ==BT_PHONE_OUTING||bt_phone_state ==BT_PHONE_INING||
bt_phone_state ==BT_PHONE_TALKINING||bt_phone_state ==BT_PHONE_TALKOUTING)
{
__wrn("**********bt calling:%d************\n",bt_phone_state);
return 1;///有事正在进行
}
else
{
//__msg("===========bt free==========\n");
return 0;
}
}
__s32 sys_bt_set_phone_state(bt_phone_state_t phone_state)
{
bt_phone_state = phone_state;
return 0;
}
__s32 sys_bt_get_phone_type(void)
{
return bt_phone_type;
}
__s32 sys_bt_set_phone_type(bt_phone_type_t phone_type)
{
bt_phone_type = phone_type;
return 0;
}
__s32 sys_bt_is_connected(void)
{
return bt_is_connected();
}
__s32 sys_bt_spp_rfcomm_is_connected(void)
{
return bt_spp_rfcomm_is_connected();
}
//这里需要用户端实现处理SPP接收到的数据
__s32 bt_spp_rx_data(char *CmdStr,unsigned char len)
{
u8 oncecmd,seccmd;
oncecmd = CmdStr[0];
seccmd = CmdStr[1];
#if RTOS
phonelink_spp_rx(CmdStr,len);
#endif
switch(oncecmd)
{
case 'A'://auto UUID CmdStr[2]
{
if(seccmd == 'A')
{
bt_spp_rx_data_rfcomm(&CmdStr[2],len-2);
sys_bt_set_phone_type(PHONE_ANDROID_AUTO);
}
}
break;
case 'B'://wireless bt version CmdStr[2]
{
if(seccmd == 'V')
{
}
}
break;
case 'D'://废弃,可不要
{
if(seccmd == 'B')//bt mac addr CmdStr[2]
{
}
}
break;
case 'I'://废弃,可不要
{
if(seccmd == 'A') //disconnect bt return state
{
}
else if(seccmd == 'B')////reconnect bt return state
{
}
}
break;
case 'J':
{
u8 i ;
if(seccmd == 'H')//phone mac addr CmdStr[2]
{
for(i=0;i<12;i++)
{
__log("%x",CmdStr[2+i]);
}
__log("\n");
}
}
break;
case 'N'://废弃,可不要
{
if(seccmd == 'A')//bt name CmdStr[2],等于 hostname
{
}
}
break;
case 'P':
{
if(seccmd == 0)//配对开始
{
}
else if(seccmd == 1)//配对成功
{
}
else if(seccmd == 2)//配对失败
{
}
// else if(seccmd == 3)//配对结束
// {
// }
}
break;
case 'S':
{
if(seccmd == 'A')//phone name CmdStr[2]
{
}
else if(seccmd == 'I')//rfcomm data CmdStr[2]
{
bt_spp_rx_data_rfcomm(&CmdStr[2],len-2);
}
else if(seccmd == 'V')//rfcomm connected return state
{
bt_spp_connect_flag = BT_SPP_STATE_CONNECTED;
}
else if(seccmd == 'S')//rfcomm disconnected return state
{
bt_spp_connect_flag = BT_SPP_STATE_DISCONNECTED;
}
}
break;
case 'U':
{
if(seccmd == 'S')//UUID start
{
}
else if(seccmd == 'U')//carplay UUID data CmdStr[2]
{
bt_spp_rx_data_rfcomm(&CmdStr[2],len-2);
sys_bt_set_phone_type(PHONE_CARPLAY);
}
else if(seccmd == 'E')//UUID end
{
}
}
break;
default:
break;
}
return EPDK_OK;
}
//这里需要用户端实现处理BLE接收到的数据
#if 0
__s32 bt_ble_rx_data(char *CmdStr,unsigned char len)
{
#if RTOS
// phonelink_ble_rx(CmdStr,len);
#endif
sys_bt_set_phone_type(PHONE_HARMONY);
switch(CmdStr[0])
{
}
return EPDK_OK;
}
#endif
static void (*connect_cb)(int status) = NULL;
void bt_hid_request_connect_cb(void *cb(int status))
{
connect_cb = cb;
}
//这里需要用户端实现处理HID接收到的数据
__s32 bt_hid_rx_data(char *CmdStr,unsigned char len)
{
u8 oncecmd,seccmd;
oncecmd = CmdStr[0];
seccmd = CmdStr[1];
#if RTOS
// phonelink_hid_rx(CmdStr,len);
#endif
switch(CmdStr[0])
{
case 'H':
{
if(seccmd == 'L')
{
}
else if(seccmd == 'B')
{
bt_hid_connect_flag = BT_HID_STATE_CONNECTED;
}
else if(seccmd == 'A')
{
bt_hid_connect_flag = BT_HID_STATE_DISCONNECTED;
}
if (connect_cb)
connect_cb(bt_hid_connect_flag);
}
break;
default:
break;
}
return EPDK_OK;
}
/**************************bt uart******************************
以下函数是系统层参考函数,需要用户端实现,
uart通讯默认波特率1152008位数据位1位停止位无校验位
**************************bt uart******************************/
__s32 uart_init = 0;////1-init,0-uninit
__s32 com_uart_init(void)
{
if(0 == uart_init)
{
uart_init = 1;
#if RTOS
rtos_com_uart_init();
#endif
#if RTT
rtt_com_uart_init();
#endif
#if LINUX
linux_com_uart_init();
#endif
}
return EPDK_OK;
}
__s32 com_uart_deinit(void)
{
if(1 == uart_init)
{
#if RTOS
rtos_com_uart_deinit();
#endif
#if RTT
rtt_com_uart_deinit();
#endif
#if LINUX
linux_com_uart_deinit();
#endif
uart_init = 0;
}
return EPDK_OK;
}
__s32 com_uart_write(char* pbuf, __s32 size)
{
#if RTOS
rtos_com_uart_write(pbuf, size);
#endif
#if RTT
rtt_com_uart_write(pbuf, size);
#endif
#if LINUX
linux_com_uart_write(pbuf, size);
#endif
return EPDK_OK;
}
__s32 com_uart_read(char* pbuf, __s32 buf_size, __s32* size)
{
#if RTOS
rtos_com_uart_read(pbuf,buf_size,size);
#endif
#if RTT
rtt_com_uart_read(pbuf,buf_size,size);
#endif
#if LINUX
linux_com_uart_read(pbuf,buf_size,size);
#endif
return EPDK_OK;
}
__s32 com_uart_flush(void)
{
#if RTOS
rtos_com_uart_flush();
#endif
#if RTT
rtt_com_uart_flush();
#endif
#if LINUX
linux_com_uart_flush();
#endif
return EPDK_OK;
}
////1-init,0-uninit
__s32 com_uart_state(void)
{
return uart_init;
}
__s32 bt_para_init(void)
{
#if RTOS
bt_phonebook_para = (bt_phonebook_state *)esMEMS_Balloc(sizeof(bt_phonebook_state));
if(bt_phonebook_para == NULL)
{
printf("=============Request phone book fail=============\n");
goto para_exit;
}
bt_ID3_info = (bt_ID3_info_t *)esMEMS_Balloc(sizeof(bt_ID3_info_t));
if(bt_ID3_info == NULL)
{
printf("=============Request bt_ID3_info fail=============\n");
goto para_exit;
}
memset((void *)bt_phonebook_para, 0, sizeof(bt_phonebook_state));
memset((void *)bt_ID3_info, 0, sizeof(bt_ID3_info_t));
#endif
return EPDK_OK;
para_exit:
#if RTOS
printf("=============Request memory fail=============\n");
if(bt_ID3_info)
{
memset(bt_ID3_info, 0, sizeof(bt_ID3_info_t));
esMEMS_Bfree(bt_ID3_info,sizeof(bt_ID3_info_t));
}
if(bt_phonebook_para)
{
memset(bt_phonebook_para, 0, sizeof(bt_phonebook_state));
esMEMS_Bfree(bt_phonebook_para,sizeof(bt_phonebook_state));
}
#endif
return EPDK_FAIL;
}
__s32 bt_para_exit(void)
{
#if RTOS
if(bt_ID3_info)
{
memset(bt_ID3_info, 0, sizeof(bt_ID3_info_t));
esMEMS_Bfree(bt_ID3_info,sizeof(bt_ID3_info_t));
}
if(bt_phonebook_para)
{
memset(bt_phonebook_para, 0, sizeof(bt_phonebook_state));
esMEMS_Bfree(bt_phonebook_para,sizeof(bt_phonebook_state));
}
#endif
return EPDK_OK;
}
__s32 bt_task_start(void)
{
#if RTOS
rtos_bt_task_start();
#endif
#if RTT
rtt_bt_task_start();
#endif
#if LINUX
linux_bt_task_start();
#endif
return EPDK_OK;
}
__s32 bt_task_stop(void)
{
#if RTOS
rtos_bt_task_stop();
#endif
#if RTT
rtt_bt_task_stop();
#endif
#if LINUX
linux_bt_task_stop();
#endif
return EPDK_OK;
}
void bt_msleep(uint16_t ticks)
{
#if RTOS
rtos_msleep(ticks);
#endif
#if RTT
rtt_msleep(ticks);
#endif
#if LINUX
linux_msleep(ticks);
#endif
return;
}
#ifdef __cplusplus
}
#endif