[第十課] 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 player
      switch(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_newTagf_nowPlayingf_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的講堂上提問與分享。


留言

熱門文章