nguyen nam / SD_PlayerSkeleton

Dependencies:   SDFileSystem_Warning_Fixed

Committer:
phungductung
Date:
Tue Jun 04 21:35:59 2019 +0000
Revision:
18:6631cd0fbbcd
Parent:
17:abfd6af9a236
WAV

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 18:6631cd0fbbcd 1
MikamiUitOpen 0:d310bb78455d 2 //--------------------------------------------------------------
MikamiUitOpen 0:d310bb78455d 3
MikamiUitOpen 0:d310bb78455d 4 #include "SD_PlayerSkeleton.hpp"
MikamiUitOpen 0:d310bb78455d 5
MikamiUitOpen 0:d310bb78455d 6 namespace Mikami
MikamiUitOpen 0:d310bb78455d 7 {
MikamiUitOpen 16:299cc1052baa 8 SD_PlayerSkeleton::SD_PlayerSkeleton(string str, bool resetButton)
MikamiUitOpen 16:299cc1052baa 9 : BUFF_SIZE_(2048), sn_(BUFF_SIZE_),
MikamiUitOpen 16:299cc1052baa 10 mySai_(SaiIO::OUTPUT, BUFF_SIZE_, AUDIO_FREQUENCY_44K),
MikamiUitOpen 16:299cc1052baa 11 sdReader_(BUFF_SIZE_),
MikamiUitOpen 8:59d3f9c81c4f 12 fileName_(""),
MikamiUitOpen 0:d310bb78455d 13 title_(214, 4, str, Label::CENTER, Font16),
MikamiUitOpen 2:511479736d6e 14 selector_(0, 22, 256, 37, sdReader_),
MikamiUitOpen 0:d310bb78455d 15 menu_(BG_LEFT_, 2, BG_WIDTH_, BG_HEIGHT_, 5,
MikamiUitOpen 14:284093250bab 16 (string[]){"SELECT", "PLAY", "PAUSE", "RESUME", "STOP"},
MikamiUitOpen 5:7c8f0fc9dfb6 17 0, 2, 1)
MikamiUitOpen 0:d310bb78455d 18 {
MikamiUitOpen 14:284093250bab 19 menu_.InactivateAll();
MikamiUitOpen 14:284093250bab 20 menu_.Activate(0);
MikamiUitOpen 14:284093250bab 21
MikamiUitOpen 0:d310bb78455d 22 if (!selector_.CreateTable())
MikamiUitOpen 0:d310bb78455d 23 BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER);
MikamiUitOpen 0:d310bb78455d 24
MikamiUitOpen 5:7c8f0fc9dfb6 25 if (resetButton) reset_ = new ResetButton();
MikamiUitOpen 5:7c8f0fc9dfb6 26 else reset_ = NULL;
MikamiUitOpen 0:d310bb78455d 27 }
MikamiUitOpen 0:d310bb78455d 28
phungductung 18:6631cd0fbbcd 29 // thực thi xử lý trình phát SD
MikamiUitOpen 0:d310bb78455d 30 void SD_PlayerSkeleton::Execute()
MikamiUitOpen 0:d310bb78455d 31 {
MikamiUitOpen 13:3df6a1f66b1c 32 bool playOk = false;
MikamiUitOpen 5:7c8f0fc9dfb6 33 int32_t loopCount;
MikamiUitOpen 5:7c8f0fc9dfb6 34
MikamiUitOpen 0:d310bb78455d 35 while (true)
MikamiUitOpen 0:d310bb78455d 36 {
phungductung 18:6631cd0fbbcd 37 if (playOk) // Trong trường hợp PLAY sau PAUSE
MikamiUitOpen 8:59d3f9c81c4f 38 loopCount = SD_Open();
phungductung 18:6631cd0fbbcd 39 else // Nếu không PLAY sau PAUSE
MikamiUitOpen 0:d310bb78455d 40 {
MikamiUitOpen 15:4ac0f4715454 41 if (0 == WaitTouched()) SelectFile();
MikamiUitOpen 0:d310bb78455d 42 loopCount = SD_Open();
phungductung 18:6631cd0fbbcd 43 while (1 != WaitTouched()) {} // Đợi cho đến khi PLAY được chạm
MikamiUitOpen 0:d310bb78455d 44 }
MikamiUitOpen 0:d310bb78455d 45
phungductung 18:6631cd0fbbcd 46 Display(); // Xử lý hiển thị dành riêng cho ứng dụng (chức năng ảo)
MikamiUitOpen 5:7c8f0fc9dfb6 47 if (reset_ != NULL) reset_->Draw();
MikamiUitOpen 0:d310bb78455d 48
phungductung 18:6631cd0fbbcd 49 menu_.Inactivate(0); // SELECT bị vô hiệu hóa
phungductung 18:6631cd0fbbcd 50 menu_.Activate(2); // PAUSE bị vô hiệu hóa
phungductung 18:6631cd0fbbcd 51 menu_.Activate(4); // STOP bị vô hiệu hóa
MikamiUitOpen 0:d310bb78455d 52
MikamiUitOpen 13:3df6a1f66b1c 53 playOk = false;
MikamiUitOpen 0:d310bb78455d 54 bool stopOk = false;
MikamiUitOpen 0:d310bb78455d 55
phungductung 18:6631cd0fbbcd 56 Clear(); // Quá trình xóa ứng dụng cụ thể (chức năng ảo)
MikamiUitOpen 0:d310bb78455d 57
phungductung 18:6631cd0fbbcd 58 mySai_.PlayOut(); // Play
MikamiUitOpen 0:d310bb78455d 59
phungductung 18:6631cd0fbbcd 60 // Lặp lại cho đến khi hết dữ liệu tệp
MikamiUitOpen 0:d310bb78455d 61 for (int k=0; k<loopCount; k++)
MikamiUitOpen 0:d310bb78455d 62 {
MikamiUitOpen 0:d310bb78455d 63 int touch42 = -1;
MikamiUitOpen 0:d310bb78455d 64 menu_.GetTouchedNumber(touch42);
MikamiUitOpen 0:d310bb78455d 65 if (touch42 == 4) break; // STOP
phungductung 18:6631cd0fbbcd 66 if (touch42 == 2) // PAUSE Xử lý khi chạm vào nút
MikamiUitOpen 0:d310bb78455d 67 {
phungductung 18:6631cd0fbbcd 68 menu_.Inactivate(2); // PAUSE Nút không hợp lệ
phungductung 18:6631cd0fbbcd 69 menu_.Activate(3); // RESUME Đã bật nút
MikamiUitOpen 0:d310bb78455d 70 mySai_.PauseOut();
MikamiUitOpen 0:d310bb78455d 71
phungductung 18:6631cd0fbbcd 72 // PLAY Đợi cho đến khi 'RESUME' hoặc 'STOP' được chạm vào
MikamiUitOpen 6:6fe2b62f259d 73 switch (WaitTouched())
MikamiUitOpen 0:d310bb78455d 74 {
phungductung 18:6631cd0fbbcd 75 case 1: playOk = true; // PLAY từ đầu
MikamiUitOpen 0:d310bb78455d 76 break;
phungductung 18:6631cd0fbbcd 77 case 3: mySai_.ResumeOut(); // Tiếp tục PLAY từ điểm PAUSE
MikamiUitOpen 8:59d3f9c81c4f 78 menu_.Activate(2);
MikamiUitOpen 0:d310bb78455d 79 menu_.Inactivate(3);
MikamiUitOpen 0:d310bb78455d 80 menu_.TouchedColor(1);
MikamiUitOpen 0:d310bb78455d 81 break;
MikamiUitOpen 13:3df6a1f66b1c 82 case 4: stopOk = true; // STOP
MikamiUitOpen 0:d310bb78455d 83 break;
MikamiUitOpen 0:d310bb78455d 84 }
MikamiUitOpen 0:d310bb78455d 85 }
MikamiUitOpen 13:3df6a1f66b1c 86 if (playOk || stopOk) break;
MikamiUitOpen 0:d310bb78455d 87
MikamiUitOpen 6:6fe2b62f259d 88 DoIfHandled();
phungductung 18:6631cd0fbbcd 89 // Xử lý tín hiệu cho một khối dành riêng cho ứng dụng (hàm ảo thuần túy)
MikamiUitOpen 0:d310bb78455d 90 SignalProcessing();
MikamiUitOpen 0:d310bb78455d 91 }
MikamiUitOpen 0:d310bb78455d 92 mySai_.StopOut();
phungductung 18:6631cd0fbbcd 93 if (!playOk) menu_.Activate(0); // SELECT hợp lệ
phungductung 18:6631cd0fbbcd 94 menu_.Draw(1); // Khởi tạo màu của nút PLAY
phungductung 18:6631cd0fbbcd 95 for (int n=2; n<5; n++) // Các nút khác bị vô hiệu hóa
MikamiUitOpen 0:d310bb78455d 96 menu_.Inactivate(n);
MikamiUitOpen 5:7c8f0fc9dfb6 97
phungductung 18:6631cd0fbbcd 98 sdReader_.Close(); // Đóng tệp SD
MikamiUitOpen 0:d310bb78455d 99 }
MikamiUitOpen 0:d310bb78455d 100 }
MikamiUitOpen 0:d310bb78455d 101
phungductung 18:6631cd0fbbcd 102 // Lấy tên tệp đã chọn mà không cần phần mở rộng
MikamiUitOpen 4:d730d024ac32 103 string SD_PlayerSkeleton::GetFileNameNoExt()
MikamiUitOpen 4:d730d024ac32 104 {
MikamiUitOpen 4:d730d024ac32 105 string fName = fileName_;
MikamiUitOpen 4:d730d024ac32 106 int k = fName.rfind(".");
MikamiUitOpen 4:d730d024ac32 107 if (k != string::npos)
MikamiUitOpen 4:d730d024ac32 108 return fName.erase(k);
MikamiUitOpen 4:d730d024ac32 109 else
MikamiUitOpen 4:d730d024ac32 110 return fName;
MikamiUitOpen 4:d730d024ac32 111 }
MikamiUitOpen 4:d730d024ac32 112
phungductung 18:6631cd0fbbcd 113 // Mở tệp thẻ SD
MikamiUitOpen 0:d310bb78455d 114 int32_t SD_PlayerSkeleton::SD_Open()
MikamiUitOpen 0:d310bb78455d 115 {
MikamiUitOpen 8:59d3f9c81c4f 116 if (fileName_.empty()) SelectFile();
MikamiUitOpen 0:d310bb78455d 117 sdReader_.Open(fileName_);
MikamiUitOpen 0:d310bb78455d 118 sdReader_.IsWavFile();
MikamiUitOpen 16:299cc1052baa 119 return sdReader_.GetSize()/BUFF_SIZE_;
MikamiUitOpen 0:d310bb78455d 120 }
MikamiUitOpen 0:d310bb78455d 121
phungductung 18:6631cd0fbbcd 122 // Lựa chọn tập tin
MikamiUitOpen 0:d310bb78455d 123 void SD_PlayerSkeleton::SelectFile()
MikamiUitOpen 0:d310bb78455d 124 {
MikamiUitOpen 5:7c8f0fc9dfb6 125 selector_.DisplayFileList();
MikamiUitOpen 0:d310bb78455d 126 title_.Draw("Select file");
phungductung 18:6631cd0fbbcd 127 menu_.Inactivate(0); // SELECT vô hiệu hóa
phungductung 18:6631cd0fbbcd 128 menu_.Inactivate(1); // PLAY vô hiệu hóa
MikamiUitOpen 0:d310bb78455d 129 do
MikamiUitOpen 0:d310bb78455d 130 if (selector_.Select(fileName_))
phungductung 18:6631cd0fbbcd 131 menu_.Activate(1); // PLAY đã bật
phungductung 18:6631cd0fbbcd 132 while (!menu_.Touched(1)); // PLAY Lặp lại cho đến khi nút được chạm
MikamiUitOpen 13:3df6a1f66b1c 133
MikamiUitOpen 13:3df6a1f66b1c 134 selector_.Erase(0, 0, BG_LEFT_-4, 272);
MikamiUitOpen 13:3df6a1f66b1c 135 title_.Draw();
MikamiUitOpen 0:d310bb78455d 136 }
MikamiUitOpen 1:c7968701f7b3 137
phungductung 18:6631cd0fbbcd 138 // Xử lý khi bảng điều khiển được vận hành
MikamiUitOpen 6:6fe2b62f259d 139 void SD_PlayerSkeleton::DoIfHandled()
MikamiUitOpen 1:c7968701f7b3 140 {
MikamiUitOpen 9:1ba92e340dce 141 if (reset_ != NULL) reset_->DoIfTouched();
phungductung 18:6631cd0fbbcd 142 Modefy(); // Ứng dụng thay đổi tham số cụ thể (chức năng ảo)
MikamiUitOpen 1:c7968701f7b3 143 }
MikamiUitOpen 6:6fe2b62f259d 144
phungductung 18:6631cd0fbbcd 145 //Đợi trong khi thực hiện Do IfHandled () cho đến khi bất kỳ nút nào trên menu được chạm vào
MikamiUitOpen 6:6fe2b62f259d 146 int SD_PlayerSkeleton::WaitTouched()
MikamiUitOpen 6:6fe2b62f259d 147 {
MikamiUitOpen 6:6fe2b62f259d 148 int touchNum;
MikamiUitOpen 6:6fe2b62f259d 149 while (!menu_.GetTouchedNumber(touchNum)) DoIfHandled();
MikamiUitOpen 6:6fe2b62f259d 150 return touchNum;
MikamiUitOpen 6:6fe2b62f259d 151 }
MikamiUitOpen 0:d310bb78455d 152 }