0 Preface/Foreword
1 数据结构
1.1 func_cb_t
//task control block
typedef struct {
u8 sta; //cur working task number
u8 last; //lask task number
#if BT_BACKSTAGE_EN
u8 sta_break; //被中断的任务
#endif
void (*mp3_res_play)(u32 addr, u32 len); //各任务的语音播报函数接口
void (*set_vol_callback)(u8 dir); //设置音量的回调函数,用于各任务的音量事件处理。
} func_cb_t;
cb:Control Block,控制块。
1.2 task number
//task number
enum {
FUNC_NULL = 0,
FUNC_MUSIC,
FUNC_FMRX,
FUNC_CLOCK,
FUNC_BT,
FUNC_BTHID,
FUNC_USBDEV,
FUNC_AUX,
FUNC_SPDIF,
FUNC_FMAM_FREQ,
FUNC_SPEAKER,
FUNC_PWROFF,
FUNC_SLEEPMODE,
FUNC_EXSPIFLASH_MUSIC,
FUNC_BT_DUT, //CBT测试模式
FUNC_BT_FCC, //FCC测试模式
FUNC_BT_IODM, //IODM测试模式
FUNC_IDLE,
FUNC_I2S,
FUNC_GACTIVITY,
FUNC_GBLOOD_OXYGEN,
FUNC_GBREATH,
FUNC_GHEARTRATE,
FUNC_GMENU,
FUNC_GMUSIC,
FUNC_GNMC,
FUNC_GSLEEP,
FUNC_GMSG,
FUNC_GQRCODE,
FUNC_GSETUP,
FUNC_GDORMANCY,
FUNC_GSTOPWATCH,
FUNC_GWEATHER,
FUNC_GWATCHFACE_CHOOSE,
FUNC_GWORKOUT_GOAL,
FUNC_GWORKOUT_CHOOSE,
FUNC_GWATCHFACE_SHOW,
FUNC_GEMIT,
FUNC_MENU_STAR,
};
2 代码分析
2.0 func_run
AT(.text.func)
void func_run(void)
{
printf("[OHZ]%s, %d\n", __func__, __LINE__);
func_bt_chk_off();
func_cb.sta = FUNC_GWATCHFACE_SHOW;
while (1) {
func_enter();
switch (func_cb.sta) {
#if 0//FUNC_MUSIC_EN
case FUNC_MUSIC:
func_music();
break;
#endif // FUNC_MUSIC_EN
case FUNC_GWATCHFACE_SHOW:
printf("[OHZ]%s, %d\n", __func__, __LINE__);
func_gwatchface_show();
break;
#if BT_EMIT_EN
case FUNC_GEMIT:
func_gemit();
break;
#endif
#if FUNC_BT_ENFUNC_MENU_STAR
case FUNC_BT:
func_bt();
break;
#endif
#if FUNC_BTHID_EN
case FUNC_BTHID:
func_bthid();
break;
#endif // FUNC_BTHID_EN
#if FUNC_AUX_EN
case FUNC_AUX:
func_aux();
break;
#endif // FUNC_AUX_EN
#if FUNC_USBDEV_EN
case FUNC_USBDEV:
func_usbdev();
break;
#endif
#if FUNC_SPDIF_EN
case FUNC_SPDIF:
func_spdif();
break;
#endif
#if FUNC_FMAM_FREQ_EN
case FUNC_FMAM_FREQ:
func_fmam_freq();
break;
#endif // FUNC_FMAM_FREQ_EN
#if FUNC_SPEAKER_EN
case FUNC_SPEAKER:
func_speaker();
break;
#endif // FUNC_SPEAKER_EN
#if FUNC_IDLE_EN
case FUNC_IDLE:
func_idle();
break;
#endif // FUNC_IDLE_EN
#if FUNC_BT_DUT_EN
case FUNC_BT_DUT:
func_bt_dut();
break;
#endif
#if FUNC_BT_FCC_EN
case FUNC_BT_FCC:
func_bt_fcc();
break;
#endif
case FUNC_MENU_STAR:
func_menu_star();
break;
case FUNC_PWROFF:
func_pwroff(sys_cb.pwrdwn_tone_en);
break;
default:
func_exit();
break;
}
}
}
2.1 func_enter
///进入一个功能的总入口
AT(.text.func)
void func_enter(void)
{
printf("[OHZ]%s, %d\n", __func__, __LINE__);
param_sync();
reset_sleep_delay();
reset_pwroff_delay();
func_cb.mp3_res_play = func_bt_mp3_res_play;
func_cb.set_vol_callback = NULL;
bsp_clr_mute_sta();
sys_cb.voice_evt_brk_en = 1; //播放提示音时,快速响应事件。
}
2.2 func_process
AT(.text.func.process)
void func_process(void)
{
WDT_CLR();
motor_process();
#if USE_CO_TIMER
co_timer_pro();
#endif
#if VBAT_DETECT_EN
lowpower_vbat_process();
#endif // VBAT_DETECT_EN
#if VUSB_TBOX_QTEST_EN
if(qtest_get_mode()){
qtest_process();
}
qtest_other_usage_process();
#endif
#if USER_NTC
if(sys_cb.ntc_2_pwrdwn_flag){
sys_cb.pwrdwn_tone_en = 1;
func_cb.sta = FUNC_PWROFF;
// printf("hello WIKI\n");
sys_cb.ntc_2_pwrdwn_flag = 0;
}
#endif
#if CHARGE_EN
if (xcfg_cb.charge_en) {
charge_detect(1);
// bsp_charge_inbox_process();
}
#endif // CHARGE_EN
#if SYS_KARAOK_EN
karaok_process();
#endif
#if LE_APP_EN
bsp_ble_process();
#endif
#if FOT_EN
bsp_fot_process();
#endif
// gsensor_process();
if (BT_DUAL_MODE_EN && xcfg_cb.ble_en) {
platform_ble_process();
}
sleep_process(bt_is_sleep);
#if FUNC_MUSIC_EN
if ((dev_is_online(DEV_UDISK)) || (dev_is_online(DEV_SDCARD)) || (dev_is_online(DEV_SDCARD1))) {
music_process_do();
}
#endif
}
2.3 func_watch_bt_process
AT(.text.func.process)
void func_watch_bt_process(void)
{
func_bt_status();
if(f_bt.disp_status == BT_STA_INCOMING) {
sfunc_bt_ring();
reset_sleep_delay();
reset_pwroff_delay();
} else if(f_bt.disp_status == BT_STA_OTA) {
sfunc_bt_ota();
reset_sleep_delay();
reset_pwroff_delay();
} else if(f_bt.disp_status >= BT_STA_OUTGOING) {
sfunc_bt_call();
reset_sleep_delay();
reset_pwroff_delay();
}
}
2.4 func_message
//func common message process
AT(.text.func.msg)
void func_message(u16 msg)
{
switch (msg) {
case EVT_KNOB_FORWARD:
printf("EVT_KNOB_FORWARD\n");
break;
default:
break;
}
2.5 func_exit
AT(.text.func)
void func_exit(void)
{
u8 func_num;
u8 funcs_total = get_funcs_total();
for (func_num = 0; func_num != funcs_total; func_num++) {
if (func_cb.last == func_sort_table[func_num]) {
break;
}
}
func_num++; //切换到下一个任务
if (func_num >= funcs_total) {
func_num = 0;
}
func_cb.sta = func_sort_table[func_num]; //新的任务
#if SYS_MODE_BREAKPOINT_EN
param_sys_mode_write(func_cb.sta);
#endif // SYS_MODE_BREAKPOINT_EN
}
本文含有隐藏内容,请 开通VIP 后查看