[第十課] MP3播放器核心運行
『滾石不生苔』"A rolling stone gathers no moss." ~ Publilius Syrus
最後的最後,還是要一提,嵌入式系統的設計,要保持常動,與時俱進。在 ACCP 的 Github Wiki 說道:『ACCP的核心程式採 狀態機 State Machine 架構方式進行:
void loop(){switch (state) {case SLEEP: { //enter sleep state... }case SCAN: { //scan tag in the field ...}case PLAYER: { //MP3 playerswitch(mode) {case 0: { // Album Loop All playing mode; ...}
case 1: { // A-B | Single playing mode; ...}
case 2: { // Audio Guide mode; ...}
case 3: { // BGM playing mode; ...}case 4: { // Playlist playing Mode; ...}case 5: { // Quiz Game Mode; ...}case 6: { // Reserve for Future; ...}... }case CONFIG: { ... }case NG_ERR: { ... }case NOP: { ... }}}
』。在常動的 Loop() 主程序,一共有 SLEEP 、 SCAN 、 PLAYER 、 CONFIG 、 NG_ERR 與 NOP 等六個狀態;狀態間的轉動並不是循序進行,而是根據每個狀態裡處理程序的結果,來決定下一個要前往的狀態。
在ACCP剛完成開機,會直接先進入 SCAN 狀態,如果沒有感應到有 X-DISC 進入,則會在與 NOP 狀態間輪轉;一直到有 X-DISC 被掃瞄到,根據曲目索引資訊跳轉到 PLAYER 狀態,執行MP3的播放;然後依據目前的播放模式 mode ,決定採用何種方式來播放。在歌曲開始播放後,仍會轉回到 NOP 與 SCAN 的循環,以保持這個期間還是可以掃瞄到 X-DISC。
要一直到單首歌播完,除了 BGM PLAYER 外,必須檢視原先的 X-DISC 是否存在,來決定下一首要播放的曲子。在 ALBUM PLAY 、 A-B REPEAT 、 PLAYLIST GO 等這三種模式,因為會紀錄目前已播放的曲目編號,所以可以保持接續播放。而 BGM PLAYER 模式,則可以不需要 X-DISC 一直插在感應區內,仍可循環隨選播放。
維持這個常動的機制,使用 f_newTag、f_nowPlaying、f_loop 等這三個旗標來維繫,其作用是:
- f_newTag 係由 SCAN 狀態下,掃瞄到與上一次有效TAG的UID不同時產生。
- f_nowPlaying 係在MP3歌曲成功播放後所涉設定,直到播完後通知解除。
- f_loop 係由 BGM PLAYER 模式開始時設定,直到不同播放模式被設定時解除。
這裡要提醒的是,在 PLAYER 狀態開始後,如有 CONFIG標籤進入,將直接跳轉至 CONFIG 狀態,也許正在播放的歌曲還在持續播放,因為 f_newTag 已經被改變,所以當該首歌播完就會結束該次的播放方式,要繼續聽必須再放回原先音樂的X-Disc。詳細狀態流程圖,請參照下圖:
大致主程序的架構說明至此,回顧這十堂課,已經將NFC ACCP的所有組件,其連接方式與程序一一說明。所謂『教學相長』,接下來該是互動的 Q&A 時間,請踴躍在LINE的講堂上提問與分享。
留言
張貼留言