Function模块
0 Preface/Foreword
1 数据结构
1.1 func_cb_t
//task control block
typedef struct {u8 sta; //cur working task numberu8 last; //lask task number
#if BT_BACKSTAGE_ENu8 sta_break; //被中断的任务
#endifvoid (*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_ENcase FUNC_MUSIC:func_music();break;
#endif // FUNC_MUSIC_ENcase FUNC_GWATCHFACE_SHOW:printf("[OHZ]%s, %d\n", __func__, __LINE__);func_gwatchface_show();break;
#if BT_EMIT_ENcase FUNC_GEMIT:func_gemit();break;
#endif
#if FUNC_BT_ENFUNC_MENU_STARcase FUNC_BT:func_bt();break;
#endif#if FUNC_BTHID_ENcase FUNC_BTHID:func_bthid();break;
#endif // FUNC_BTHID_EN#if FUNC_AUX_ENcase FUNC_AUX:func_aux();break;
#endif // FUNC_AUX_EN#if FUNC_USBDEV_ENcase FUNC_USBDEV:func_usbdev();break;
#endif#if FUNC_SPDIF_ENcase FUNC_SPDIF:func_spdif();break;
#endif#if FUNC_FMAM_FREQ_ENcase FUNC_FMAM_FREQ:func_fmam_freq();break;
#endif // FUNC_FMAM_FREQ_EN#if FUNC_SPEAKER_ENcase FUNC_SPEAKER:func_speaker();break;
#endif // FUNC_SPEAKER_EN#if FUNC_IDLE_ENcase FUNC_IDLE:func_idle();break;
#endif // FUNC_IDLE_EN#if FUNC_BT_DUT_ENcase FUNC_BT_DUT:func_bt_dut();break;
#endif
#if FUNC_BT_FCC_ENcase FUNC_BT_FCC:func_bt_fcc();break;
#endifcase 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_TIMERco_timer_pro();
#endif
#if VBAT_DETECT_ENlowpower_vbat_process();
#endif // VBAT_DETECT_EN#if VUSB_TBOX_QTEST_ENif(qtest_get_mode()){qtest_process();}qtest_other_usage_process();
#endif#if USER_NTCif(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_ENif (xcfg_cb.charge_en) {charge_detect(1);
// bsp_charge_inbox_process();}
#endif // CHARGE_EN#if SYS_KARAOK_ENkaraok_process();
#endif#if LE_APP_ENbsp_ble_process();
#endif
#if FOT_ENbsp_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_ENif ((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_ENparam_sys_mode_write(func_cb.sta);
#endif // SYS_MODE_BREAKPOINT_EN
}